3

文字列に Unicode 正規化形式 C を適用すると、文字列内のコード ポイントの数は増えますか?

4

1 に答える 1

7

はい、NFC 正規化を適用した後、複数のコード ポイントに展開されるコード ポイントがあります。たとえば、 Basic Multilingual Plane内には、NFC 正規化の適用後に 2 つのコード ポイントに展開される 70 のコード ポイントがあり、3 に展開される 2 つのコード ポイント ( Alphabetic Presentation Forms ブロック内の U+FB2C および U+FB2D ) があります。コード ポイント。

このいわゆる「拡張係数」に対する 1 つの保証は、NFC 正規化が適用された後、文字列の長さが (コード単位の数に関して) 3 倍を超えて拡張されないことです。

また、すべてのバージョンの Unicode で正規マッピングが常に制限されるという Unicode コンソーシアムの安定性ポリシーもあります。そのため、NFC で分解されたときに文字列の長さが 3 倍を超えて拡張されることはありません (コード単位で測定)。これは、テキストが UTF-8、UTF-16、または UTF-32 のいずれであっても当てはまります。この保証により、特にバッファ サイズの決定において、処理の特定の最適化も可能になります。

セクション 9、正規化フォームの検出. UAX #15: Unicode 正規化フォーム。

Unicode ブロック内のどのコード ポイントが複数のコード ポイントに展開されるかを判断する Java プログラムを作成しました: http://ideone.com/9PUOCb

別の方法として、Unicode::Tussle CPAN モジュールの一部であるTom Christiansenunicharsユーティリティを使用することもできます。(注: Mac ユーザーはmake test、Perl のバージョンが古すぎるというインストール手順でエラーを表示する場合があります。このエラーが表示された場合はnotest install Unicode::Tussle、CPAN シェル内で実行してモジュールをインストールできます。)

例:

  • 3 つのコード ポイントに展開される BMP のコード ポイントを出力します。

    unichars '長さ (NFC) == 3'
    U+FB2C ヘブライ文字 SHIN WITH DAGESH AND SHIN DOT
    U+FB2D ヘブライ文字 SHIN WITH DAGESH AND SIN DOT
  • 複数のコード ポイントに展開されるすべての平面のコード ポイントの数を数えます。

    unichars -a '長さ (NFC) > 1' | トイレ -l
          85

よく寄せられる質問も参照してください。さまざまな正規化形式の最大拡張係数は何ですか?

于 2013-07-27T11:59:49.517 に答える