std.uni
この std.uni
モジュールは
基本的なUnicodeアルゴリズムとデータ構造の実装を提供する。
これにはUTFエンコードとデコードのプリミティブは含まれない、
参照 std.utf.decodeと std.utf.encodeを参照のこと。 std.utf
を参照のこと。
列挙したすべてのプリミティブは、Unicode文字および 文字のセットを操作する。ASCII文字を操作し、Unicode文字を無視する関数については を操作し、Unicode文字を無視する関数については std.ascii. Unicode文字、コードポイント、その他の用語の定義については このモジュールを通して使用される用語の定義については、以下の用語セクションを参照のこと。 を参照のこと。
このモジュールの焦点は、Unicodeを認識するアプリケーションを開発するためのコア・ニーズである。 このモジュールは、Unicode対応アプリケーションを開発する際の核心的なニーズに焦点を当てている。そのために、以下の最適化されたプリミティブを提供する:
- カテゴリと共通プロパティによる文字分類: isAlpha, isWhiteなどである。
- 大文字小文字を区別しない文字列比較 (sicmp, icmp).
- を介してテキストを4つの正規化形式のいずれかに変換する。 normalize.
- デコード(decodeGrapheme)と反復(byGrapheme, graphemeStride) ユーザーによって認識された文字、つまり Graphemeクラスタである。
- 個々の文字を正準ルールまたは互換ルールに従って分解・合成する。 または互換性のルールに従って個々の文字を分解および合成する。 composeと decompose, ハングルの音節に対する特定のバージョンを含む composeJamo および decomposeHangul.
アプリケーションは、一般的に知られていないアルゴリズムなど、さらなる機能拡張や拡張が必要な場合がある。 一般にあまり知られていないアルゴリズムなどの拡張が必要な場合もある、 あるいは、地域固有のニーズに合わせて既存のものをカスタマイズする必要があるかもしれない。ユーザーを支援するために コアプリミティブを超える追加機能を構築する際に、ユーザーを支援する、 モジュールが提供する:
- CodepointSet文字集合を簡単に操作するための型である。 典型的な集合代数の他に、珍しい機能を提供する: この集合のコード・ポイントを検出するためのDソース・コード生成器である。 これはメタプログラミング・パーサー・フレームワークの恩恵である、 のような小さな集合の分類に内部的に使われている。 のような小さな集合の分類に威力を発揮する。 isWhite.
- 最適なパックされた多段テーブルを構築する方法は、Trieの特殊なケースとしても知られている。 としても知られている。 関数は codepointTrie, codepointSetTrie 関数は、dcharを "値"にマップするカスタム・トライを構築する。 最終的な結果は、高速で予測可能なΟ(1)ルックアップである。 のような関数を強力にする。 isAlphaそして combiningClass, のような関数だが、ユーザー定義のデータセットに対応する。
- を実行するUnicode対応パーサーに有用なテクニックである。 エンコードされたコードポイントの文字分類を行う の文字分類を行うUnicode対応パーサーにとって有用なテクニックは、非assassaryなデコードを全力で避けることである。 utfMatcherは、通常のワークフロー デコードと分類のステップを組み合わせた ステップを組み合わせる。符号化されたコードユニットから必要なビットを直接抽出することで コードユニットから必要なビットを直接抽出することで 大幅な性能向上を実現する。参照 MatcherConceptを参照のこと。 を参照のこと。
- カスタマイズされた正規化のための一般的に有用な構成要素である: combiningClassクラス そして allowedInをテストする。 プロパティをテストする。
- 一般的に使用されるコード・ポイント・セットの豊富なセレクションにアクセスできる。 サポートされているセットには、スクリプト、 Block、General Categoryがある。セットの正確な内容は CLDRユーティリティの プロパティ・インデックス・ページ で見ることができる。 参照 unicodeを参照のこと。 クエリを参照のこと。
概要
import std.uni; void main() { // スクリプト/ブロックまたはプロパティ名を使用してコードポイントセットを初期化する // これで、'set'には両方のスクリプトのコードポイントが含まれる。 auto set = unicode("Cyrillic") | unicode("Armenian"); // 同じことだが、よりシンプルで、コンパイル時にチェックされる auto ascii = unicode.ASCII; auto currency = unicode.Currency_Symbol; // 簡単なセット操作 auto a = set & ascii; assert(a.empty); // asciiと交差しないので a = set | ascii; auto b = currency - a; // すべてのASCII、キリル文字、アルメニア文字を引く // コードポイントセットのいくつかの特性 assert(b.length > 45); // Unicode 6.1では46項目、6.2ではさらに増える // 集合にコードポイントが存在するかどうかを調べるのはちょうどいいが、 // O(logN)である assert(!b['$']); assert(!b['\u058F']); // アルメニア・ドラム記号 assert(b['¥']); // 高速なルックアップテーブルを構築することで、O(1)の複雑性を保証する // 1レベルのTrieルックアップテーブルは、本質的には巨大なビットセットであり、262Kb程度である auto oneTrie = toTrie!1(b); // 2レベルはかなりコンパクトだが、通常は若干遅い auto twoTrie = toTrie!2(b); // 3レベルはさらに小さく、少し遅い auto threeTrie = toTrie!3(b); assert(oneTrie['£']); assert(twoTrie['£']); assert(threeTrie['£']); // 最も適切なtrieレベルでtrieを構築し、 // ファンクターとしてバインドする auto cyrillicOrArmenian = toDelegate(set); auto balance = find!(cyrillicOrArmenian)("Hello ընկեր!"); assert(balance == "ընկեր!"); // bool delegate(dchar)と互換性がある bool delegate(dchar) bindIt = cyrillicOrArmenian; // 正規化 string s = "Plain ascii (and not only), is always normalized!"; assert(s is normalize(s));// 同じ文字列である string nonS = "A\u0308ffin"; // 合字 auto nS = normalize(nonS); // NFCは、W3Cが承認した標準規格である assert(nS == "Äffin"); assert(nS != nonS); string composed = "Äffin"; assert(normalize!NFD(composed) == "A\u0308ffin"); // NFKDは、あいまいな照合・検索に役立つ互換性分解 assert(normalize!NFKD("2¹⁰") == "210"); }
用語
以下はUnicodeの重要な用語のリストである。 および定義のリストである。この モジュールだけで使用される規約は、そのようにマークされている。説明は正式な の第3章にあるような正式な定義に基づいている。
テキストデータの編成、制御、表現に使用される情報の単位、 テキストデータの構成、制御、または表現に使用される情報の単位。 注釈:- データを表現する場合、そのデータの性質は データの性質は、他の種類のデータ(例えば視覚的なデータ)とは対照的に、一般的に記号的である。 データの性質は一般的に記号的である。
- 抽象文字は具体的な形を持たない グリフと混同してはならない。
- 抽象文字は必ずしも ユーザが"文字"として考えるものと必ずしも一致しない. と混同してはならない. Grapheme.
- エンコードされた抽象文字は(エンコードされた文字を参照) は、Unicode抽象文字として知られている。
- 直接エンコードされていない抽象文字は Unicode標準によって直接エンコードされていない抽象文字は、多くの場合、文字シーケンスの組み合わせによって表現することができる。 文字列を組み合わせて表現することができる。
- カノニカル結合クラスが0でない文字はすべて結合文字である。 は結合文字であるが、その逆は当てはまらない: 結合クラスが0である結合文字は存在する。
- これらの文字は通常、単独では使用されない。 これらの文字は、記述される場合を除き、通常は単独では使用されない。これらの文字には次のようなものがある。 アクセント記号、ダイアクリティクス、ヘブライ語のポイント、アラビア語の母音記号などである、 およびインディアンのマトラスが含まれる。
- 書記素クラスタは、水平方向に分割可能なテキストの単位を表す。 によって構成される。 によって構成される。 によって構成される。
- 書記素クラスターは通常、ある書記素ベースから始まり で始まり、その後に続く非空白記号の列にまたがって広がっていく。 書記素クラスターは、テキストのレンダリングや、カーソルの配置やテキストの表示などの処理に最も直接関係する。 編集時のカーソル配置やテキスト選択などの処理に最も直接的に関係する、 しかし、比較や検索にも関連する場合がある。
- 多くの処理において、書記素クラスタはあたかも1つの文字のように動作する。 多くの処理では、書記素クラスタは、書記素ベースと同じプロパティを持つ単一の文字であるかのように動作する。 事実上、ノンスペーシングマークはベースに対してグラフィカルに適用される、 しかし、その特性を変えることはない。
このモジュールは書記素を扱ういくつかのプリミティブを定義する: Grapheme, decodeGraphemeおよび graphemeStride. これらはすべて、前述の標準付属書で定義されている拡張書記素境界 を使用している。
を持つ結合文字。 ノンスペーシングマーク(Mn)または囲みマーク(Me)の一般カテゴリを持つ結合文字。 ノンスペーシングマークではない結合文字。正規化
正規等価 または互換等価 Unicode標準における正規等価文字や互換等価文字の概念により、Unicode文字列の等価性の完全で正式な定義が必要となっている。 が必要である。 文字列の等価性は、正規化と呼ばれるプロセスによって決定される、 文字列の等価性は、正規化と呼ばれるプロセスによって決定される。 に変換する。これが正規化処理の主な目的である、 関数を参照のこと。 normalizeを参照のこと。 に変換する関数を参照のこと。
Unicode正規化書式の非常に重要な属性は、Unicode標準のバージョン間で安定していなければならないということである。 の非常に重要な属性は、Unicode標準のバージョン間で安定していなければならないということである。 あるUnicode文字列があるUnicode正規化形式 に正規化されたUnicode文字列は、将来のバージョンの実装でもその正規化形式 形式のままであることが保証される。
Unicode標準は4つの正規化形式を規定している。 非公式には、これらの形式のうち2つは等価シーケンスの最大分解によって定義されている。 で定義される。 である。
- 正規化形式 D (NFD):文字列の正準分解。
- 正規形KD (NFKD): 文字列の正規分解:文字列の互換性分解。
- 正規形 C (NFC): 正規形分解の正準合成。 の正準合成。 の正準合成。
- 正規形 KC (NFKC) : 正規形文字列の正準成分:符号化文字列の互換性分解の正準合成 文字列の互換性分解の正準構成。
正規化形式の選択は、特定のユースケースに依存する。 NFCは一般的なテキストに最適な形式である。 レガシー・エンコーディングから変換された文字列との互換性が高いからである。NFKCは 識別子、特にセキュリティ上の懸念がある場合は、NFKCが望ましい形式である。NFDとNFKD は内部処理に最も有用である。
ルックアップテーブルの構築
Unicode標準は、以下のような一連のアルゴリズムを記述している。 を記述している。 を素早く検索できることに依存している。約100万個のコードポイントを持つコード空間を考えると のためにスペース効率の良い解決策を提供することは、些細な仕事ではない。 を提供するのは容易なことではない。
ハッシュテーブルやバイナリサーチのような一般的なアプローチでは、コードポイント区間をソートすることができない。 のように)ソートされたコードポイント区間に対するバイナリサーチのような一般的なアプローチでは不十分である。 InversionList)のような一般的なアプローチでは不十分である。 ハッシュテーブルには膨大なメモリー・フットプリントがあり、区間上のバイナリ探索 は一部の負荷の高いアルゴリズムには十分な速度ではない。
推奨される解決法(Unicode実装ガイドライン参照)は の実装である多段テーブルを使用することである。 の実装である多段テーブルを使用することである。 の実装である多段テーブルを使用することである。この節の残りの部分では では、これを固定トライと呼ぶ。以下では、ある特定の実装について説明する。 の実装について説明する。 理想的なサイズの節約を犠牲にして、アクセス速度を追求した特定の実装について説明する。
2レベルTrieを例にとると、動作原理は以下のようになる。 キー(コードポイント、21ビット)のビット数を2つの要素に分割する。 (例えば15と8)に分割する。 つはトライのインデックスのビット数である。 もう1つは、トライの各ページのビット数である。 トライのレイアウトは、サイズ2^ビット-オブ-インデックスの配列となる。 サイズ2^bit-of-page/bits-per-elementのメモリチャンクの配列である。
ページ数は可変である。 インデックスのエントリ数とは異なる。インデックスのスロット のスロットはすべて存在するページの番号を含んでいなければならない。ルックアップは次のようになる。 上位ビットをスライスする、 このインデックスでページを取得し、そのページ内のオフセットとして下位ビットを使用する。 下位ビットをこのページ内のオフセットとして使用する。
ページが結果的に、1つの配列にレイアウトされていると仮定すると、擬似的な処理は以下のようになる。 pages 、擬似コードは次のようになる:auto elemsPerPage = (2 ^^ bits_per_page) / Value.sizeOfInBits;
pages[index[n >> bits_per_page]][n & (elemsPerPage - 1)];
ここで、elemsPerPage が2のべき乗である場合、全体の処理は次のようになる。 一握りの単純な命令と2回の配列読み取りである。後続のレベル トライの後続レベルは、この概念を再帰することで導入される。 は値として扱われる。インデックス配列は値として扱われる。 カレントインデックス(current-index)」と新しい「アッパーインデックス(upper-index)」の2つに分割される。
完全を期すために、レベル1のトライは単なる配列である。 現在の実装では、ビットパック値を利用している。 を利用している (bool など)。 手動での適用については BitPackedも参照のこと。 しかし、サイズの大きな利点は 構造上、複数のidentical pages on every level are merged 。
トライを構築するプロセスはより複雑であり、便利関数の形でユーザーから隠されている。 便利な関数の形でユーザーから隠されている。 codepointTrie, codepointSetTrieとさらに便利な toTrie. 一般に、dchar "型"を持つ集合や組み込みのAAは、トライにすることができる。 はトライに変換できる。このモジュールの このモジュールのtrieオブジェクトは読み取り専用(不変)である。
Unicodeプロパティ
を通してアクセス可能なUnicodeプロパティの完全なリストである。 unicode カテゴリごとに特定のヘルパーがネストされている。これは CLDRユーティリティ を参照すること。
以下の一般的なカテゴリー・セットには unicodeショートハンドアクセッサでのみアクセスできる。
Abb. | 長い形式 | Abb. | 長い形式 | Abb. | ロングフォーム |
---|---|---|---|---|---|
L | 文字 | Cn | 未割り当て | ポ | その他の句読点 |
Ll | 小文字 | Co | 私用 | Ps | オープン句読点 |
Lm | 修飾子_文字 | Cs | サロゲート | S | 記号 |
Lo | その他の文字 | N | 数字 | Sc | 通貨記号 |
Lt | タイトルケース | Nd | 10進数 | Sk | 修飾記号 |
Lu | 大文字 | Nl | 文字_数字 | Sm | 数学記号 |
M | 記号 | いいえ | その他の数字 | だから | その他の記号 |
マック | スペーシングマーク | P | 句読点 | Z | 区切り記号 |
Me | 囲みマーク | Pc | コネクタ_句読点 | Zl | 行区切り記号 |
Mn | ノンスペーシング・マーク | Pd | ダッシュ_句読点 | Zp | 段落区切り記号 |
C | その他 | Pe | 閉じ句読点 | Zs | スペース区切り記号 |
Cc | コントロール | Pf | 最終句読点 | - | 任意 |
Cf | 書式 | 円周率 | 初期句読点 | - | ASCII |
でアクセス可能な、その他の一般的に有用なプロパティのセット。 でアクセスできる unicode:
名前 | 名前 | 名前 |
---|---|---|
アルファベット | 表意文字 | その他の大文字 |
ASCII_Hex_Digit | IDS_Binary_Operator | パターン_構文 |
双方向制御 | ID_開始 | パターン_ホワイトスペース |
ケース入り | IDS_三進演算子 | クォーテーション_マーク |
ケース_無視可能 | ジョイン_コントロール | ラディカル |
ダッシュ | 論理的順序の例外 | ソフトドット |
デフォルトのコードポイント | 小文字 | スターム |
非推奨 | 数学 | 終端句読点 |
ダイアクリティック | 非文字コードポイント | 統一イデオグラフ |
エクステンダー | その他のアルファベット | 大文字 |
書記素ベース | その他_デフォルト_無視可能なコードポイント | バリエーションセレクター |
書記素拡張 | その他 | ホワイトスペース |
書記素_リンク | その他_ID_継続 | XID_Continue |
16進数 | その他_ID開始 | XID_開始 |
ハイフン | その他の小文字 | |
ID_継続 | その他_数学 |
以下は、ブロック名の表である。 unicode.block. 注釈: 省略版では、"In" が必要である。 unicodeはブロック名の前に "In" をブロック名の前に付ける必要がある。 スクリプトとブロックを曖昧にしないためである。
エーゲ数字 | エチオピア語拡張 | モンゴル語 |
錬金術記号 | エチオピア語拡張A | 音楽記号 |
アルファベットの表示形式 | エチオピア語の補足 | ミャンマー語 |
古代ギリシャ楽譜 | 一般的な句読点 | ミャンマー語拡張A |
古代ギリシャ数字 | 幾何学図形 | 新しいタイ・ルー |
古代の記号 | グルジア語 | NKo |
アラビア語 | グルジア語の補足 | 数字の形式 |
アラビア語拡張A | グラゴル語 | オガム |
アラビア数字アルファベット記号 | ゴシック | オルチキ |
アラビア語表示形式-A | ギリシャ語とコプト語 | 旧イタリック |
アラビア語表示体-B | ギリシャ語拡張 | 旧ペルシア語 |
アラビア語補足 | グジャラート語 | 旧南アラビア語 |
アルメニア語 | グルムキー語 | 古トルコ語 |
矢印 | 半角と全角 | 光学式文字認識 |
アベスタン語 | ハングル互換ジャモ | オリヤ語 |
バリ語 | ハングル | オスマン語 |
バム語 | ハングル・ジャモ・エクステンデッドA | ファグ・パ |
バムサプリメント | ハングル・ジャモ・エクステンデッドB | ファイストスディスク |
基本ラテン語 | ハングル・シラブル | フェニキア語 |
バタク語 | ハヌヌ | 音声拡張 |
ベンガル語 | ヘブライ語 | 音声拡張の補足 |
ブロック要素 | 私的使用の多いサロゲート | トランプ |
ボポモフォ | 高サロゲート | プライベートエリア |
ボポモフォ拡張 | ひらがな | レジャン |
箱書き | 表意文字 | ルーミー数字記号 |
ブラーフミー | 帝国アラム語 | ルーン文字 |
点字パターン | パフラヴィー語 | サマリア語 |
ブギニー語 | パルティア語碑文 | サウラーシュトラ |
ブヒード | IPA拡張 | シャラダ語 |
ビザンチン音楽記号 | ジャワ語 | シャヴィ語 |
カリア語 | カイティ語 | シンハラ語 |
チャクマ語 | カナ補足 | スモールフォームのバリエーション |
チャム | カンブン | ソラ・ソンペン |
チェロキー | 康熙帝ラジカル | スペーシング修飾文字 |
日中韓の互換性 | カンナダ語 | 特殊文字 |
日中韓互換フォーム | カタカナ | スンダ語 |
日中韓互換表意文字 | カタカナ発音拡張 | スンダ補足 |
日中韓互換表意文字補遺 | カヤ・リー | 上付き文字と下付き文字 |
日中韓ラジカル補足 | カロシチ | 矢印Aの補足 |
日中韓ストローク | クメール語 | 矢印Bの補足 |
日中韓の記号と句読点 | クメール語の記号 | 数学演算子の補足 |
日中韓統一表意文字 | ラオス語 | 句読点の補足 |
日中韓統合表意文字拡張A | ラテン語-1補足 | 私用領域Aの補足 |
日中韓統合表意文字拡張B | ラテン拡張A | 補足的私用領域-B |
日中韓統合表意文字拡張C | ラテン拡張追加 | シロティ・ナグリ |
日中韓統合表意文字拡張D | ラテン拡張B | シリア語 |
ダイアクリティカルマークの組み合わせ | 拡張ラテン語-C | タガログ語 |
記号のダイアクリティカル・マークの組み合わせ | ラテン拡張-D | タグバンワ語 |
ダイアクリティカルマークの組み合わせ 補足 | レプチャ語 | タグ |
ハーフマークの組み合わせ | 文字類似記号 | タイ・レ |
一般的な数字形式 | リンブー | タイタム |
コントロールピクチャー | リニアB表意文字 | タイ・ベト |
コプト語 | リニアB音節 | タイ宣経記号 |
数え棒数字 | リス | タクリ |
楔形文字 | 低サロゲート | タミル語 |
楔形文字の数字と句読点 | リシア語 | テルグ語 |
通貨記号 | リディア語 | ターナ |
キプロス文字 | 麻雀牌 | タイ語 |
キリル文字 | マラヤーラム語 | チベット語 |
キリル拡張A | マンダイ文字 | ティフィナ |
キリル文字拡張-B | 数学英数字記号 | 交通および地図記号 |
キリル文字の補足 | 数学演算子 | ウガリット語 |
デゼレット | ミーティ・マイェク | 統一カナダ原住民語シラビックス |
デーヴァナーガリー語 | ミーティ・マエク拡張 | 統一カナディアン・アボリジニ・シラビックス拡張 |
拡張デーヴァナーガリー | メロイ語草書体 | ヴァイ |
ディンバット | メロイ語ヒエログリフ | バリエーション・セレクター |
ドミノタイル | ミャオ | バリエーションセレクター補足 |
エジプト象形文字 | その他の数学記号-A | ヴェーダ拡張 |
顔文字 | その他の数学記号-B | 縦書きのフォーム |
囲み英数字 | その他の記号 | 易経六芒星記号 |
囲み英数字補足 | その他の記号と矢印 | 李基数 |
囲み日中韓文字と月 | その他の記号と絵文字 | 彝文字 |
囲み表意文字補足 | 雑多な技術 | |
エチオピア語 | 修飾語音調文字 |
以下の表は、エチオピア語の文字名である。 unicode.script および省略形の unicode:
アラビア語 | ハヌヌー | 旧イタリア語 |
アルメニア語 | ヘブライ語 | ペルシア語 |
アベスタン語 | ひらがな | 旧南アラビア語 |
バリ語 | アラム語 | 古トルコ語 |
バム語 | 継承語 | オリヤ語 |
バタック語 | パフラヴィ語 | オスマン語 |
ベンガル語 | パルティア語 | パグ語 |
ボポモフォ語 | ジャワ語 | フェニキア語 |
ブラフミー | カイティ | レジャン |
点字 | カンナダ語 | ルーン語 |
ブギニー語 | カタカナ | サマリア語 |
ブヒッド語 | カイヤ語 | Saurashtra |
カナダ系アボリジニ | カロシュティ | シャラーダ |
カリアン | クメール語 | シャビアン |
チャクマ語 | ラオス語 | シンハラ語 |
チャム語 | ラテン語 | ソラ語 |
チェロキー | レプチャ語 | スンダ語 |
コモン | リンブー | シロティ語 |
コプト語 | リニア語 | シリア語 |
楔形文字 | リス語 | タガログ語 |
キプロス語 | リシア語 | タグバンワ語 |
キリル文字 | リディア語 | タイ・ル語 |
デゼレット語 | マラヤーラム語 | タイタム |
デーヴァナーガリー語 | マンダ語 | タイ語 |
エジプト象形文字 | ミーティーマイェク | タクリ語 |
エチオピア語 | メロイ語_草書体 | タミル語 |
グルジア語 | ヒエログリフ | テルグ語 |
グラゴル語 | ミャオ語 | ミャンマー語 |
ゴート語 | モンゴル語 | タイ語 |
ギリシャ語 | ミャンマー語 | チベット語 |
グジャラート語 | ニュータイ語 | ティフィナ語 |
グルムキー語 | ンコ語 | ウガリット語 |
ハン語 | オガム語 | ヴァイ語 |
ハングル | Ol_Chiki | イ |
以下は unicode.hangulSyllableType.
Abb. | ロングフォーム |
---|---|
L | リーディング_ジャモ |
LV | LV_音節 |
LVT | LVT_シラブル |
T | 後続ジャモ |
V | 母音 |
商標 Unicode(tm)はUnicode, Inc.の商標である。
- enum dchar
lineSep
; - 定数コードポイント(0x2028) - 行区切り。
- enum dchar
paraSep
; - 定数コード点(0x2029) - 段落区切り。
- enum dchar
nelSep
; - 定数符号点(0x0085) - 次の行。
- template
isCodepointSet
(T) - Tがある種のコードポイントの集合であるかどうかをテストする。テンプレート制約を意図している。
- enum auto
isIntegralPair
(T, V = uint); - T が暗黙的にV に変換される整数のペアであるかどうかをテストする。 以下のコードは、T のペアに対してコンパイルされなければならない:
(T x){ V a = x[0]; V b = x[1];}
以下はコンパイルしてはならない:(T x){ V c = x[2];}
- alias
CodepointSet
= InversionList!(GcPolicy).InversionList; - コードポイントのセットに対する推奨デフォルト型。 詳細は現在の実装を参照のこと: InversionList.
- struct
CodepointInterval
; - の推奨型を参照のこと。 std.typecons.Tuple の推奨型は、符号点の[a, b) 間隔を表す。で使用されている InversionList. どのような区間型もパスすべきである。 isIntegralPairをパスしなければならない。
- struct
InversionList
(SP = GcPolicy); InversionList
はコードポイントの集合である の配列として表現される。 の配列として表現されるコードポイントの集合である(上記 CodepointIntervalを参照)。 この名前は、左から右への読み方に由来する。 例えば、すべての値[10, 50)、[80, 90)の集合は次のようになる、 と特異値60の集合は次のようになる:10, 50, 60, 61, 80, 90
読み方は次のようになる。 これをどう読むかというと、負から始まるということは、次の数より小さい数はすべてこの集合に含まれないということである(正はその逆)。 正はその逆)。そして、左から右に数字が渡されるたびに、正負を入れ替える。 左から右へ数字が渡されるたびに、正負が入れ替わる。
こうすると、マイナスは10まで、プラスは50までとなる、 次に負を60まで、正を61まで、といった具合だ。 このように、冗長性の高いデータをスペース効率よく保存することができる。 をスペース効率よく保存することができる。ユニコード文字 プロパティがうまく適合する。この手法自体は、RLEエンコーディングのバリエーションとして見ることができる。 RLEエンコーディングのバリエーションと見ることもできる。
セットは(int のように)値型である。 は決してエイリアスされない。
例:
auto a = CodepointSet('a', 'z'+1); auto b = CodepointSet('A', 'Z'+1); auto c = a; a = a | b; assert(a == CodepointSet('A', 'Z'+1, 'a', 'z'+1)); assert(a != c);
以下も参照のこと。 unicodeを参照のこと。 を参照のこと。
メモリ使用量は、セット内の各連続区間あたり8バイトである。 値セマンティクスは COWテクニック したがって、この型をsharedにキャストするのは安全ではない。
注釈: この型は共有型である。
のテンプレート・パラメーターや現在のコードポイントの正確な型に依存することは推奨されない。 std.uni で設定されているコードポイントの正確な型に依存することは推奨されない。 標準アロケータの設計が最終化されたときに、型やパラメータが変更される可能性がある。 アロケータの設計が最終化されたときに、型やパラメータが変更される可能性がある。 テンプレートと併用するか isCodepointSetを使うか、デフォルトの エイリアス CodepointSetを使うこともできる。
- pure this(Set)(Set
set
)
if (isCodepointSet!Set); - 任意の型の別のコードポイントセットから構築する。
- pure this(Range)(Range
intervals
)
if (isForwardRange!Range && isIntegralPair!(ElementType!Range)); - コードポイント区間の前方範囲から集合を構成する。
- this()(uint[]
intervals
...); - 符号点間隔のプレーン値から集合を構成する。Examples:
import std.algorithm.comparison : equal; auto set = CodepointSet('a', 'z'+1, 'а', 'я'+1); foreach (v; 'a'..'z'+1) assert(set[v]); // キリル文字小文字の間隔 foreach (v; 'а'..'я'+1) assert(set[v]); //特定の順序は必要なく、間隔が交差することもある auto set2 = CodepointSet('а', 'я'+1, 'a', 'd', 'b', 'z'+1); //同じ結果になる assert(set2.byInterval.equal(set.byInterval)); // テストコンストラクタ this(Range)(Range intervals) auto chessPiecesWhite = CodepointInterval(9812, 9818); auto chessPiecesBlack = CodepointInterval(9818, 9824); auto set3 = CodepointSet([chessPiecesWhite, chessPiecesBlack]); foreach (v; '♔'..'♟'+1) assert(set3[v]);
- @property scope auto
byInterval
(); - この中のすべてのコードポイント区間にまたがる範囲を取得する。 InversionList.
- const bool
opIndex
(uintval
); - この集合にコードポイント
val
の有無をテストする。Examples:auto gothic = unicode.Gothic; // ゴシック文字 ahsa assert(gothic['\U00010330']); // ゴシックには当然、asciiは含まれていない assert(!gothic['$']);
- @property size_t
length
(); - この集合のコード・ポイントの数
- This
opBinary
(string op, U)(Urhs
)
if (isCodepointSet!U || is(U : dchar)); 集合は集合代数の自然な構文をサポートしている:
演算子 数学表記法 説明 & a∩b 交点 | a∪b 共用体 - a ∖ b 減算 ~ a ~ b 対称集合の差、すなわち(a∪b)は(a∩b)を表す。 Examples:import std.algorithm.comparison : equal; import std.range : iota; auto lower = unicode.LowerCase; auto upper = unicode.UpperCase; auto ascii = unicode.ASCII; assert((lower & upper).empty); // 交わらない auto lowerASCII = lower & ascii; assert(lowerASCII.byCodepoint.equal(iota('a', 'z'+1))); // 小文字のASCIIをすべて捨てる writeln((ascii - lower).length); // 128 - 26 auto onlyOneOf = lower ~ ascii; assert(!onlyOneOf['Δ']); // ASCIIではなく、小文字でもない assert(onlyOneOf['$']); // ASCIIで小文字ではない assert(!onlyOneOf['a']); // ASCIIと小文字 assert(onlyOneOf['я']); // ASCIIではなく小文字 // ASCIIの大文字小文字をすべて捨てる auto noLetters = ascii - (lower | upper); writeln(noLetters.length); // 128 - 26 * 2
- ref This
opOpAssign
(string op, U)(Urhs
)
if (isCodepointSet!U || is(U : dchar)); - 上記の演算子オーバーロードの'op='バージョン。
- const bool
opBinaryRight
(string op : "in", U)(Uch
)
if (is(U : dchar)); - コードポイント
ch
があるかどうかをテストする、 と同じである。 opIndex.Examples:assert('я' in unicode.Cyrillic); assert(!('z' in unicode.Cyrillic));
- auto
opUnary
(string op : "!")(); - この集合の反転集合を得る。See Also:
- @property auto
byCodepoint
(); - この集合の各コードポイントにまたがる範囲。Examples:
import std.algorithm.comparison : equal; import std.range : iota; auto set = unicode.ASCII; set.byCodepoint.equal(iota(0, 0x80));
- void
toString
(Writer)(scope Writersink
, ref scope const FormatSpec!charfmt
); - このInversionListのテキスト表現を得る。 をテキストで取得する。フォーマットフラグは、例えば各値に個別に適用される:
- %s と%d は、区間を [low ... high) 積分の範囲としてフォーマットする。
- %x 区間を[low .. high)範囲の小文字16進数としてフォーマットする。
- %X 区間を[low .. high)範囲の大文字16進文字でフォーマットする。
Examples:import std.conv : to; import std.format : format; import std.uni : unicode; // これはもともとキリル文字を使用していた。 // 残念ながら、これは変更が頻繁に行われる範囲であり、 // そのため更新の際に壊れてしまった。 // そのため、変更される可能性が低い「基本ラテン文字」 // の範囲が代わりに使用された。 writeln(unicode.InBasic_latin.to!string); // "[0..128)" // 仕様'%s'と'%d'は、上記のto!string呼び出しと同等である。 writeln(format("%d", unicode.InBasic_latin)); // unicode.InBasic_latin.to!string writeln(format("%#x", unicode.InBasic_latin)); // "[0..0x80)" writeln(format("%#X", unicode.InBasic_latin)); // "[0..0X80)"
- ref auto
add
()(uinta
, uintb
); - この集合に区間[a, b]を加える。Examples:
CodepointSet someSet; someSet.add('0', '5').add('A','Z'+1); someSet.add('5', '9'+1); assert(someSet['0']); assert(someSet['5']); assert(someSet['9']); assert(someSet['Z']);
- @property auto
inverted
(); - この集合の反転集合を得る。同じように演算子を使う場合は、'! opUnaryを参照のこと。Examples:
auto set = unicode.ASCII; // 逆元との結合は、Unicodeのすべてのコードポイントを取得する writeln((set | set.inverted).length); // 0x110000 // 逆数との交わりなし assert((set & set.inverted).empty);
- string
toSourceCode
(stringfuncName
= ""); - の名前を持つ単項関数のDソースコードを文字列として生成する。
funcName
dchar の単項関数のソースコードを文字列で生成する。もしfuncName
が空の場合 の場合、ラムダ関数として調整される。生成された関数は、渡されたコードポイントがこの集合に属するかどうかをテストする。 がこのセットに属するかどうかをテストする。結果は文字列ミックスインで使われる。 想定される使用領域は、パーサー・ジェネレーターなどでのメタプログラミングによる積極的な最適化である。 による積極的な最適化である。注釈 比較的小さいセットや規則的なセットには注意して使用すること。それは 多段テーブルを使うよりも遅くなる可能性がある。
例:
import std.stdio; // [a, b$RPAREN間隔を直接セットする auto set = CodepointSet(10, 12, 45, 65, 100, 200); writeln(set); writeln(set.toSourceCode("func"));
上記は次のように出力される:bool func(dchar ch) @safe pure nothrow @nogc { if (ch < 45) { if (ch == 10 || ch == 11) return true; return false; } else if (ch < 65) return true; else { if (ch < 100) return false; if (ch < 200) return true; return false; } }
- const @property bool
empty
(); - このセットにコード・ポイントが含まれていなければ真。Examples:
CodepointSet emptySet; writeln(emptySet.length); // 0 assert(emptySet.empty);
- template
codepointSetTrie
(sizes...) if (sumOfIntegerTuple!sizes == 21) - カスタムのマルチレベル固定トライを作成するための略記法である。 CodepointSet sizes はレベルごとのビット数である、 最上位ビットが最初に使用される。
注釈: sizes の合計は21でなければならない。
See Also:toTrieこれはさらに単純である。例:」である。
{ import std.stdio; auto set = unicode("Number"); auto trie = codepointSetTrie!(8, 5, 8)(set); writeln("Input code points to test:"); foreach (line; stdin.byLine) { int count=0; foreach (dchar ch; line) if (trie[ch])// 数字である count++; writefln("Contains %d number code points.", count); } }
- template
CodepointSetTrie
(sizes...) if (sumOfIntegerTuple!sizes == 21) - codepointSetTrie関数によって生成されたTrieの型。
- template
codepointTrie
(T, sizes...) if (sumOfIntegerTuple!sizes == 21)
templateCodepointTrie
(T, sizes...) if (sumOfIntegerTuple!sizes == 21) - Unicodeデータの固定されたTrie を構築するための少し一般的なツールである。特に、codepointSetTrie とは異なり、 のマッピングを作成することができる。 dchar から任意の型T へのマッピングを作成できる。
注釈 CodepointSetsを取るオーバーロードは、当然ながら をブールマッピングTries にのみ変換する。
CodepointTrieは、codepointTrie関数によって生成されるTrieの型である。- auto
codepointTrie
()(T[dchar]map
, TdefValue
= T.init); - auto
codepointTrie
(R)(Rrange
, TdefValue
= T.init)
if (isInputRange!R && is(typeof(ElementType!R.init[0]) : T) && is(typeof(ElementType!R.init[1]) : dchar));
- struct
MatcherConcept
; - すべてのUTF Matcherに共通するプロパティの概要を示す概念的な型である。
注釈: 説明のためだけに、すべてのメソッド 呼び出しはすべてアサーションに失敗する。 具体的なマッチャーを取得するには utfMatcherを使って具象マッチャ を取得するために使用する。
- bool
match
(Range)(ref Rangeinp
)
if (isRandomAccessRange!Range && is(ElementType!Range : char));
boolskip
(Range)(ref Rangeinp
)
if (isRandomAccessRange!Range && is(ElementType!Range : char));
booltest
(Range)(ref Rangeinp
)
if (isRandomAccessRange!Range && is(ElementType!Range : char)); に対する効果は
inp
は、呼び出される関数の種類に依存する:マッチ。コードポイントが集合の中に見つかれば、範囲
inp
は、コード単位でそのサイズだけ進められる、 そうでなければ、範囲は変更されない。スキップする。テストの結果に関係なく のサイズだけ進められる。
テストする。テスト。 テストの結果に関係なく。
Examples:string truth = "2² = 4"; auto m = utfMatcher!char(unicode.Number); assert(m.match(truth)); // '2'は確かに数字だ assert(truth == "² = 4"); // 一致する assert(m.match(truth)); // soは上付き文字の'2'である assert(!m.match(truth)); // スペースは数字ではない assert(truth == " = 4"); // 一致しない場合は影響されない assert(!m.skip(truth)); // 同じテスト ... assert(truth == "= 4"); // が、それに関わらずコードポイントをスキップする assert(!m.test(truth)); // '='は数字ではない assert(truth == "= 4"); // テストは決して引数に影響を与えない
- @property auto
subMatcher
(Lengths...)(); - 高度な機能 - 既知のエンコード長に基づくマッチャーのサブセットへの直接アクセスを提供する。 のサブセットへの直接アクセスを提供する。長さは コード単位で提供される。サブマッチャーは test /match 。サブマッチャーは、以下のようなコードポイントにはマッチしないので、注意して使用すること。 サブマッチャーは、選択された長さの集合に属さない符号化長を持つコードポイントにはマッチしないので、注意して使用すること。 サブマッチャーは、選択された長さの集合に属さない符号化長を持つコードポイントにはマッチしないので、注意して使用すること。また、サブマッチャーオブジェクトは を参照するので、親マッチャーのliftetimeを越えて使用してはならない。 を超えて使用してはならない。 サブ・マッチャーを使用するもう1つの注意点は、スキップが使用できないことである。 が使用できないことである。
- enum auto
isUtfMatcher
(M, C); - Char の範囲に対して、M がUTF Matcherであるかどうかをテストする。
- auto
utfMatcher
(Char, Set)(Setset
)
if (isCodepointSet!Set); - Matcher オブジェクトを構築する。 からコードポイントを分類する
set
のコードポイントを分類する matcher オブジェクトを構築する。 Char からコードポイントを分類する matcher オブジェクトを構築する。APIの概要は MatcherConceptを参照のこと。 - auto
toTrie
(size_t level, Set)(Setset
)
if (isCodepointSet!Set); - の最適な構成を構築するための便利な関数である。 の最適な構成を構築する
set
を構築するための便利な関数である。パラメータlevel は、使用するトライレベルの数を示す、 許容される値は以下の通りである:1、2、3または4である。レベルは異なるトレードオフを表す スピードとサイズのトレードオフを表す。レベル1は最も高速で、最もメモリを消費する(ビット配列)。
レベル4は最も遅く、フットプリントが最も小さい。
例については「あらすじ」のセクションを参照のこと。注釈 レベル4は非常に実用的である(より速く、より予測可能である)。 を直接ルックアップするのに比べて、非常に実用的である。
set
に直接ルックアップするのに比べ、非常に実用的である。 - auto
toDelegate
(Set)(Setset
)
if (isCodepointSet!Set); 一般的に最適なスピードとサイズのトレードオフでTrie 。 を構築し、それを以下の型のデリゲートにラップする: bool delegate(dchar ch).
事実上、これは「テスター」ラムダを作成する。 std.algorithm.findのような単項述語を取るアルゴリズムに適している。
例については「概要」のセクションを参照のこと。- struct
unicode
; - ブロック、スクリプト、一般カテゴリの名前またはエイリアスによってUnicodeコードポイントセットを検索するための単一のエントリポイント。 ブロック、スクリプト、または一般的なカテゴリ。プロパティ名検索のよく定義された標準ルールを使用する。 これには、名前のファジーマッチングが含まれる。 'White_Space'、'white-SpAce'、'whitespace' はすべて等しいとみなされる。 と'white_Space'はすべて等しいとみなされ、同じ空白文字の集合が得られる。
- pure @property auto
opDispatch
(string name)(); - コンパイル時の正しさをチェックしながら の検索を実行する。 このショートカット・バージョンは、3つの検索を組み合わせている: ブロック全体、スクリプト、共通のバイナリー・プロパティである。スクリプトとブロックは重複しているので、曖昧さをなくすための通常のトリックが使われる。 ブロックを取得するには unicode.InBlockName スクリプトを検索するには unicode.ScriptName を使う。See Also:
- auto
opCall
(C)(scope const C[]name
)
if (is(C : dchar)); - ブロック、スクリプト、バイナリー・プロパティにまたがって同じ検索を行う、 であるが、実行時に実行される。 このバージョンは
name
それ以外の場合は、コンパイル時に チェックされた opDispatchの方が良い選択である。利用可能なセットについては、プロパティの表を参照のこと。 セットを参照のこと。 - struct
block
; - すべてのUnicodeブロックに対してコードポイントの集合を絞り込む。
注釈: ここでは、スクリプトは検索されないので、ブロック名は曖昧ではない。 したがって、検索には単に unicode.
利用可能なセットについてはプロパティの表を参照のこと。block
.BlockName記法を使用する。See Also:プロパティの表を参照のこと。Examples:// .blockを使用して明示的にする writeln(unicode.block.Greek_and_Coptic); // unicode.InGreek_and_Coptic
- struct
script
; - コードポイントのセットをすべてのユニコードスクリプトに絞り込んで検索する。利用可能なセットについてはプロパティの表を参照のこと。 セットを参照のこと。Examples:
auto arabicScript = unicode.script.arabic; auto arabicBlock = unicode.block.arabic; // スクリプトとブロックの間に交点がある assert(arabicBlock['']); assert(arabicScript['']); // しかし、両者は異なるものである assert(arabicBlock != arabicScript); writeln(arabicBlock); // unicode.inArabic writeln(arabicScript); // unicode.arabic
- struct
hangulSyllableType
; - 指定されたハングル音節型を持つコードポイントの集合を取得する。他のバイナリでないプロパティも(サポートされれば)、同じ表記に従う unicode.propertyName.propertyValue 記法に従う。 チェックされたアクセスはunicode.propertyName(propertyValue) は実行時にチェックされる。 利用可能なセットについてはプロパティの表を参照のこと。 セットを参照のこと。Examples:
// Lは、unicode.Lのショートカットのように文字ではなく音節型である auto leadingVowel = unicode.hangulSyllableType("L"); // 先頭の母音が存在するか確認する foreach (vowel; '\u1110'..'\u115F') assert(leadingVowel[vowel]); writeln(leadingVowel); // unicode.hangulSyllableType.L
- CodepointSet
parseSet
(Range)(ref Rangerange
, boolcasefold
= false)
if (isInputRange!Range && is(ElementType!Range : dchar)); - ユニコードのコードポイント集合を解析する。
range
を解析する。 構文'[...]'を使う。範囲は、正規表現セットの定義をスキップする。casefold
パラメータは、大文字小文字を区別するかどうかを決定する。 つまり、セット内の文字に小文字と大文字の両方を含める。
- pure @safe size_t
graphemeStride
(C)(scope const C[]input
, size_tindex
)
if (is(C : dchar)); - Parameters:
C に暗黙的に変換可能な "型"である。dchars C[] input
書記素クラスタの配列 size_t index
への開始インデックス。 input
[]Returns:書記素クラスターの長さExamples:writeln(graphemeStride(" ", 1)); // 1 // A + combing ring above string city = "A\u030Arhus"; size_t first = graphemeStride(city, 0); assert(first == 3); //\u030Aは2つのUTF-8コードユニットを持つ writeln(city[0 .. first]); // "A\u030A" writeln(city[first .. $]); // "rhus"
- Grapheme
decodeGrapheme
(Input)(ref Inputinp
)
if (isInputRange!Input && is(immutable(ElementType!Input) == immutable(dchar))); - dcharの入力範囲から1つの完全な書記素クラスタを読み出す。 dcharの入力範囲から1つの完全な書記素クラスターを読み取る。
inp
.例:" を参照のこと。 Graphemeを参照のこと。注釈 この関数は次のように変更する。
inp
したがってinp
はL値でなければならない。 - auto
byGrapheme
(Range)(Rangerange
)
if (isInputRange!Range && is(immutable(ElementType!Range) == immutable(dchar))); 文字列を Grapheme.
によって文字列を反復処理する。 文字列を操作するのに便利である。
See Also:Examples:import std.algorithm.comparison : equal; import std.range.primitives : walkLength; import std.range : take, drop; auto text = "noe\u0308l"; // noëlはe + 結合二重引用符を使用する assert(text.walkLength == 5); // 5つのコードポイント auto gText = text.byGrapheme; assert(gText.walkLength == 4); // 4グラフェム assert(gText.take(3).equal("noe\u0308".byGrapheme)); assert(gText.drop(3).equal("l".byGrapheme));
- auto
byCodePoint
(Range)(Rangerange
)
if (isInputRange!Range && is(immutable(ElementType!Range) == immutable(Grapheme)));
autobyCodePoint
(Range)(Rangerange
)
if (isInputRange!Range && is(immutable(ElementType!Range) == immutable(dchar))); の範囲をコードポイントに変換する。 Graphemeをコードポイントの範囲に変換する。
に対する操作を行った後に、結果を文字列に変換するのに便利である。 結果を文字列に変換するのに便利である。
コードポイントの範囲を渡された場合、同等の能力を持つ範囲を返す。
Examples:import std.array : array; import std.conv : text; import std.range : retro; string s = "noe\u0308l"; // noël // これを反転させ、結果を文字列に変換する string reverse = s.byGrapheme .array .retro .byCodePoint .text; assert(reverse == "le\u0308on"); // lëon
- struct
Grapheme
; Grapheme
は値セマンティクスを持つ。Grapheme
は常に異なるオブジェクトを指す。実際のシナリオではGrapheme
はスタックに収まるので、非常に長いクラスタ以外ではメモリ割り当てのオーバーヘッドを避けることができる。 を回避できる。See Also:- this(C)(scope const C[]
chars
...)
if (is(C : dchar));
this(Input)(Inputseq
)
if (!isDynamicArray!Input && isInputRange!Input && is(ElementType!Input : dchar)); - Ctor
- const pure nothrow @nogc @trusted dchar
opIndex
(size_tindex
); - このクラスタ内の指定されたインデックスにあるコードポイントを取得する。
- pure nothrow @nogc @trusted void
opIndexAssign
(dcharch
, size_tindex
); - このクラスタ内の指定されたインデックスの
ch
を書き込む。警告 この機能を使用すると、書記素クラスタが無効になる可能性がある、 も参照のこと。 Grapheme.valid.
Examples:auto g = Grapheme("A\u0302"); writeln(g[0]); // 'A' assert(g.valid); g[1] = '~'; // ASCIIのチルダは結合記号ではない writeln(g[1]); // '~' assert(!g.valid);
- pure nothrow @nogc @safe SliceOverIndexed!Grapheme
opSlice
(size_ta
, size_tb
) return;
pure nothrow @nogc @safe SliceOverIndexed!GraphemeopSlice
() return; - Graphemeの文字をランダムアクセスできる。
警告 このGraphemeがスコープから外れると無効になる、 このGraphemeがスコープを離れると無効になる。
- const pure nothrow @nogc @property @safe size_t
length
(); - Grapheme クラスタの長さをコードポイントで表す。
- ref @trusted auto
opOpAssign
(string op)(dcharch
); - この書記素に文字
ch
を追加する。警告 この機能を使用すると、書記素クラスタが無効になる可能性がある、 valid も参照のこと。
See Also:Examples:import std.algorithm.comparison : equal; auto g = Grapheme("A"); assert(g.valid); g ~= '\u0301'; assert(g[].equal("A\u0301")); assert(g.valid); g ~= "B"; // もはや有効な書記素クラスタではない assert(!g.valid); // しかし、まだ役に立つかもしれない assert(g[].equal("A\u0301B"));
- ref auto
opOpAssign
(string op, Input)(scope Inputinp
)
if (isInputRange!Input && is(ElementType!Input : dchar)); - 入力範囲のすべての文字を
inp
に追加する。 - @property bool
valid
()(); - このオブジェクトが有効な拡張書記素クラスタを含んでいれば真。 このモジュールの復号プリミティブは常に有効なGrapheme を返す。
- int
sicmp
(S1, S2)(scope S1r1
, scope S2r2
)
if (isInputRange!S1 && isSomeChar!(ElementEncodingType!S1) && isInputRange!S2 && isSomeChar!(ElementEncodingType!S2)); 大文字小文字を区別しない
r1
とr2
. この関数は、より単純な比較ルールを使用する。 である。 icmp.しかし、以下の警告に注意してほしい。Returns:int 。文字列が一致すれば0となる、 <0である。r1
が辞書的にr2
, >よりも辞書的に "大きい"場合はr1
が辞書的にr2
警告 この関数は1:1コードポイントマッピングしか扱わない。 のみを処理するため、ドイツ語やギリシャ語などの特定のアルファベットには不十分である。 のような特定のアルファベットには不十分である。
See Also:Examples:writeln(sicmp("Август", "авгусТ")); // 0 // ギリシャ語も、1:Mのマッピングがない限りは使える writeln(sicmp("ΌΎ", "όύ")); // 0 // 次のようなものは、 // ギリシャ文字の小文字のiotaとtonos、dialytikaとして等価に一致しない assert(sicmp("ΐ", "\u03B9\u0308\u0301") != 0); // 一方、icmpではそのような問題はない writeln(icmp("ΐ", "\u03B9\u0308\u0301")); // 0 writeln(icmp("ΌΎ", "όύ")); // 0
- int
icmp
(S1, S2)(S1r1
, S2r2
)
if (isForwardRange!S1 && isSomeChar!(ElementEncodingType!S1) && isForwardRange!S2 && isSomeChar!(ElementEncodingType!S2)); - の大文字小文字を区別しない比較を行う。
r1
とr2
. 完全な大文字小文字変換のルールに従う。 これには、ドイツ語のßを "ss"と等しくマッチさせることも含まれる。 とは異なり、他の1:Mコードポイントマッピングも含まれる。 sicmp. .と違ってicmp
衒学的に正しいことの代償は パフォーマンスが若干悪くなることだ。Parameters:S1 r1
前方文字の範囲 S2 r2
前方文字の範囲 Returns:文字列が一致する場合は0となるint 、 str1 が辞書的にstr2 より「小さい」場合は <0 、 str1 、辞書的に "大きい"場合は">0"である。str2See Also:Examples:writeln(icmp("Rußland", "Russland")); // 0 writeln(icmp("ᾩ -> \u1F70\u03B9", "\u1F61\u03B9 -> ᾲ")); // 0
Examples:とそのエイリアスを使うことで std.utf.byUTFとそのエイリアスを使用することで、自動デコードによるGCアロケーションと や例外のスローを回避できる。icmp
@safe @nogc nothrow pure.import std.utf : byDchar; writeln(icmp("Rußland".byDchar, "Russland".byDchar)); // 0 writeln(icmp("ᾩ -> \u1F70\u03B9".byDchar, "\u1F61\u03B9 -> ᾲ".byDchar)); // 0
- pure nothrow @nogc @safe ubyte
combiningClass
(dcharch
); の結合クラスを返す。
ch
.Examples:// コードを短くする alias CC = combiningClass; // チルダを組み合わせる writeln(CC('\u0303')); // 230 // 下のリングを組み合わせる writeln(CC('\u0325')); // 220 // 単純な帰結として、 // "チルダ"は"下のリング"の後に置かれるべきである
- enum
UnicodeDecomposition
: int; - Unicode 文字分解型。
Canonical
- 正準分解。結果は正準等価シーケンスである。
Compatibility
- 互換分解。結果は互換等価シーケンスである。
注釈 互換性分解は非可逆変換である、 ファジーマッチや内部処理にのみ適している。
- pure nothrow @safe dchar
compose
(dcharfirst
, dcharsecond
); - 前提として
first
がsecond
であることを仮定している、 通常、最初がスターターであることを意味する。注釈 ハングル音節はこの関数の対象外である。 以下のcomposeJamo 。
Examples:writeln(compose('A', '\u0308')); // '\u00C4' writeln(compose('A', 'B')); // dchar.init writeln(compose('C', '\u0301')); // '\u0106' // スターターは最初の1つであるため、 // 以下はcomposeしないことに注意 writeln(compose('\u0308', 'A')); // dchar.init
- @safe Grapheme
decompose
(UnicodeDecomposition decompType = Canonical)(dcharch
); 注釈:この関数はハングルの音節も分解する。 この関数はハングルの音節も分解する。 も分解する。
See Also:decomposeHangul限定版 ハングルの音節だけを考慮し、他の分解は考慮しない。 他の分解は考慮しない。Examples:import std.algorithm.comparison : equal; writeln(compose('A', '\u0308')); // '\u00C4' writeln(compose('A', 'B')); // dchar.init writeln(compose('C', '\u0301')); // '\u0106' // スターターは最初の1つであるため、 // 以下はcomposeしないことに注意 writeln(compose('\u0308', 'A')); // dchar.init assert(decompose('Ĉ')[].equal("C\u0302")); assert(decompose('D')[].equal("D")); assert(decompose('\uD4DC')[].equal("\u1111\u1171\u11B7")); assert(decompose!Compatibility('¹')[].equal("1"));
- pure nothrow @safe Grapheme
decomposeHangul
(dcharch
); - Examples:
import std.algorithm.comparison : equal; assert(decomposeHangul('\uD4DB')[].equal("\u1111\u1171\u11B6"));
- pure nothrow @nogc @safe dchar
composeJamo
(dcharlead
, dcharvowel
, dchartrailing
= (dchar).init); - 先頭の子音(
lead
), avowel
と任意のtrailing
子音jamosで構成する。成功すると、構成された LV または LVT ハングルの音節を返す。 もしlead
とvowel
のいずれかが有効なハングル音節でない場合 のいずれかが有効なハングル文字クラスでない場合、dchar.init.Examples:writeln(composeJamo('\u1111', '\u1171', '\u11B6')); // '\uD4DB' // T母音を除いたり、末尾子音でない符号を飛ばしたりすると、 // LV音節が構成される writeln(composeJamo('\u1111', '\u1171')); // '\uD4CC' writeln(composeJamo('\u1111', '\u1171', ' ')); // '\uD4CC' writeln(composeJamo('\u1111', 'A')); // dchar.init writeln(composeJamo('A', '\u1171')); // dchar.init
- enum
NormalizationForm
: int; - 正規化フォームの列挙型、 のような関数のテンプレート化された関数パラメータとして渡される。 normalize.
NFC
NFD
NFKC
NFKD
- 正規化形式を示す値からの省略形エイリアス。
- pure @safe inout(C)[]
normalize
(NormalizationForm norm = NFC, C)(return scope inout(C)[]input
); - 戻り値
input
選択された形式に正規化された文字列。 デフォルトでは C 形式が使用される。正規化形式の詳細については 正規化セクションを参照のこと。注釈 問題の文字列がすでに正規化されている場合、その文字列は修正されずに返される、 は変更されずに返され、メモリ確保は行われない。
Examples:// どんなエンコーディングでも機能する wstring greet = "Hello world"; assert(normalize(greet) is greet); // まったく同じスライス // 4つのフォームがすべて異なるキャラクターの例: // アキュート記号とフック記号を持つギリシャのウプシロン(コードポイント 0x03D3) writeln(normalize!NFC("ϓ")); // "\u03D3" writeln(normalize!NFD("ϓ")); // "\u03D2\u0301" writeln(normalize!NFKC("ϓ")); // "\u038E" writeln(normalize!NFKD("ϓ")); // "\u03A5\u0301"
- bool
allowedIn
(NormalizationForm norm)(dcharch
); - 正規化で "dchar"が常に許可されているかどうかをテストする。
ch
が常に許可されているか (Quick_Check=YES) をテストする。 フォームnorm 。Examples:// 例: キリル文字は常に許可されている。soはASCIIである assert(allowedIn!NFC('я')); assert(allowedIn!NFD('я')); assert(allowedIn!NFKC('я')); assert(allowedIn!NFKD('я')); assert(allowedIn!NFC('Z'));
- pure nothrow @nogc @safe bool
isWhite
(dcharc
); - がユニコードの空白文字であるかどうか。
c
がUnicode空白文字であるかどうか。 (一般的なUnicodeのカテゴリ:C0(タブ、垂直タブ、フォームフィード、 キャリッジリターン、ラインフィード文字)、Zs、Zl、Zp、NEL(U+0085)の一部) - pure nothrow @nogc @safe bool
isLower
(dcharc
); - がUnicode小文字であるかどうかを返す。
c
が Unicode小文字であるかどうかを返す。 - pure nothrow @nogc @safe bool
isUpper
(dcharc
); - がUnicode大文字かどうかを返す。
c
がUnicode大文字であるかどうかを返す。 - auto
asLowerCase
(Range)(Rangestr
)
if (isInputRange!Range && isSomeChar!(ElementEncodingType!Range) && !isConvertibleToString!Range);
autoasUpperCase
(Range)(Rangestr
)
if (isInputRange!Range && isSomeChar!(ElementEncodingType!Range) && !isConvertibleToString!Range); - 入力範囲 または文字列を大文字または小文字に変換する。メモリを割り当てない。 デコードできないUTF-8またはUTF-16形式の文字は、大文字として扱われる。 として扱う。 std.utf.replacementDchar.Parameters:
Range str
文字列または文字の範囲 Returns:入力範囲dcharsExamples:import std.algorithm.comparison : equal; assert("hEllo".asUpperCase.equal("HELLO"));
- auto
asCapitalized
(Range)(Rangestr
)
if (isInputRange!Range && isSomeChar!(ElementEncodingType!Range) && !isConvertibleToString!Range); - 入力範囲 つまり、最初の つまり、最初の文字を大文字に、それ以降の文字を小文字に変換する。メモリを割り当てない。 デコードできないUTF-8またはUTF-16形式の文字は、以下のように扱われる。 として扱われる。 std.utf.replacementDchar.Parameters:
Range str
文字列または文字の範囲 Returns:dcharの入力範囲See Also:Examples:import std.algorithm.comparison : equal; assert("hEllo".asCapitalized.equal("Hello"));
- pure @trusted void
toLowerInPlace
(C)(ref C[]s
)
if (is(C == char) || is(C == wchar) || is(C == dchar)); - を小文字に変換する。
s
を小文字に変換する。 数文字の文字列では、変換後に文字列長が長くなることがある、 そのような場合、関数は正確に一度だけ再割り当てを行う。 もしs
に大文字がなければs
は変更されない。 - pure @trusted void
toUpperInPlace
(C)(ref C[]s
)
if (is(C == char) || is(C == wchar) || is(C == dchar)); - 大文字に変換する
s
を大文字に変換する。 数文字の文字列の場合、変換後に文字列の長さが長くなることがある、 そのような場合、関数は正確に一度だけ再割り当てを行う。 もしs
に小文字がない場合s
は変更されない。 - pure nothrow @nogc @safe dchar
toLower
(dcharc
); 警告 ドイツ語やギリシャ語のような特定のアルファベットは、1:1のマッピングを持たない。 を持たない。代わりに完全な文字列を受け取るtoLowerのオーバーロードを使用する。
- @trusted ElementEncodingType!S[]
toLower
(S)(return scope Ss
)
if (isSomeString!S);
ElementEncodingType!S[]toLower
(S)(Ss
)
if (!isSomeString!S && (isRandomAccessRange!S && hasLength!S && hasSlicing!S && isSomeChar!(ElementType!S))); - と同じ新しい配列を作成する。
s
ただし 文字が(Unicodeの小文字マッピングによって)すべて小文字に変換されることを除いては、同じ新しい配列を作成する。 もしs
文字がない場合はs
であれば、それ自身が返される。s
が string-のような型が返される。Parameters:S s
ランダムアクセス範囲 文字の Returns:と同じ要素型を持つ配列。s
. - pure nothrow @nogc @safe dchar
toUpper
(dcharc
); 警告 ドイツ語やギリシャ語のような特定のアルファベットは、1:1の大文字と小文字の対応を持たない。 を持たない。代わりに完全な文字列を受け取るtoUpperのオーバーロードを使用する。
toUpperは、次の引数として使用できる。 std.algorithm.iteration.map の引数として使うことができる。 アルゴリズムを生成する。 文字列は std.algorithm.mutation.copy を使って std.array.appender.Examples:import std.algorithm.iteration : map; import std.algorithm.mutation : copy; import std.array : appender; auto abuf = appender!(char[])(); "hello".map!toUpper.copy(abuf); writeln(abuf.data); // "HELLO"
- @trusted ElementEncodingType!S[]
toUpper
(S)(return scope Ss
)
if (isSomeString!S);
ElementEncodingType!S[]toUpper
(S)(Ss
)
if (!isSomeString!S && (isRandomAccessRange!S && hasLength!S && hasSlicing!S && isSomeChar!(ElementType!S))); - と同じ新しい配列を確保する。
s
と同じである。 文字が(Unicode大文字マッピングによって)すべて大文字に変換されること以外は同じである。 もしs
文字が影響を受けなかった場合はs
が返される。s
がstring-like型であれば、それ自身が返される。Parameters:S s
ランダムアクセス範囲 文字の Returns:と同じ要素型を持つ新しい配列。s
. - pure nothrow @nogc @safe bool
isAlpha
(dcharc
); - を返す。
c
がUnicodeのアルファベット文字 (一般Unicodeカテゴリ: Alphabetic)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isMark
(dcharc
); - が
c
がUnicodeマーク (一般的なUnicodeのカテゴリ:Mn、Me、Mc)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isNumber
(dcharc
); - が
c
がUnicode数値文字 (Unicodeの一般カテゴリ:Nd, Nl, No)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isAlphaNum
(dcharc
); - が
c
がUnicodeのアルファベット文字か数字かを返す。 (一般的なUnicodeのカテゴリ:アルファベット、Nd、Nl、No)。Parameters:dchar c
任意のUnicode文字 Returns:true その文字がAlphabetic、Nd、Nl、またはNo Unicodeにある場合 カテゴリ - pure nothrow @nogc @safe bool
isPunctuation
(dcharc
); - がUnicode句読点文字であるかどうかを返す。
c
がUnicode句読点文字であるかどうかを返す (一般的なUnicodeカテゴリ:Pd、Ps、Pe、Pc、Po、Pi、Pf)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isSymbol
(dcharc
); - が
c
がUnicode記号文字 (一般的なUnicodeカテゴリ: Sm, Sc, Sk, So)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isSpace
(dcharc
); - が
c
がUnicodeスペース文字 (一般的なUnicodeカテゴリ:Zs) - pure nothrow @nogc @safe bool
isGraphical
(dcharc
); - を参照のこと。
c
が Unicode グラフィカル文字であるかどうかを返す (一般的な Unicode カテゴリ: L、M、N、P、S、Zs)。 - pure nothrow @nogc @safe bool
isControl
(dcharc
); - が
c
がUnicode制御文字 (一般的なUnicodeカテゴリ:Cc)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isFormat
(dcharc
); - が
c
がUnicodeフォーマット文字 (Unicodeの一般カテゴリ:Cf)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isPrivateUse
(dcharc
); - が
c
がUnicode私用コードポイント (一般的なUnicodeカテゴリ:Co)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isSurrogate
(dcharc
); - が
c
がUnicodeサロゲートコードポイント (一般 Unicode カテゴリ:Cs)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isSurrogateHi
(dcharc
); - を返す。
c
がUnicode上位サロゲート(先頭サロゲート)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isSurrogateLo
(dcharc
); - が
c
がUnicode低サロゲート(トレイルサロゲート)であるかどうかを返す。 - pure nothrow @nogc @safe bool
isNonCharacter
(dcharc
); - がUnicode非文字iであるかどうかを返す。
c
がUnicode非文字であるかどうかを返す。 抽象文字が割り当てられていないコードポイントであるかどうかを返す。 (一般的なUnicodeカテゴリ:Cn)
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku