「大文字と小文字を区別しない」正規化された形式の Unicode テキストを生成する必要がある C プロジェクトに取り組んでいます。最初に正規化フォーム NFD に変換し、次に Unicode 大文字と小文字の折り畳みアルゴリズムを適用し、最後に結果を Unicode 正規化フォーム NFC に変換することによって達成される正規化フォームを定義することにしました。
私は Unicode 表現とユーティリティ関数を ICU の C API に依存しており、ICU の関数unorm_normalize()
とu_strFoldCase()
関数を使用して私のスキームを実装するのはかなり簡単でした。しかし、私のテストの 1 つが失敗しており、その理由がわかりません。ICU は、私の予想とは異なる NFC フォームを生成しているようです。
入力シーケンスは、次の BMP コード ポイントで構成されます。
U+0020, U+1EA5, U+0328, U+1EC4, U+031C
デバッガーを介して、ケース フォールディング後の中間結果について ICU と同意することを確認しました。
U+0020 U+0061 U+0328 U+0302 U+0301 U+0065 U+031C U+0302 U+0303
特に、NFD を形成するための初期の変換では、関係する文字の相対 CCC 番号に基づいて、文字 U+031C が U+1EC4 の分解の途中に移動したことに特に注意してください。それは私がテストしようとしているものの一部です。
ここで良い点: ICU によると、折りたたまれた文字シーケンスの NFC 正規化は
U+0020 U+0105 U+0302 U+0301 U+1ec5 U+031C
一方、私はそうあるべきだと思います
U+0020 U+0105 U+0302 U+0301 U+0065 U+031C U+0302 U+0303
末尾の 3 つの結合文字は既に標準的な順序になっており、U+0065 と U+031C の標準的な合成は存在しないためです。
だから、2つの質問:
- 正しい NFC フォームはどれですか?
- ICUが正しいなら、なぜですか?