文字列に Unicode 正規化形式 C を適用すると、文字列内のコード ポイントの数は増えますか?
1 に答える
はい、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 Christiansenのunichars
ユーティリティを使用することもできます。(注: 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
よく寄せられる質問も参照してください。さまざまな正規化形式の最大拡張係数は何ですか?