文字列の正規化
4種類の正規化方法
Unicode では、文字の分解や合成、よく似た文字などのために、見かけが同じ文字列でも、バイト列としては複数の表現が可能となっています。そこで、文字列の検索などを行いやすくするために、Unicode では、以下の4種類の正規化方法が規定されています。
- NFC - 正規合成
- NFD - 正規分解
- NFKC - 正規互換合成
- NFKD - 正規互換分解
検索する文字列および検索対象の双方を、上記のいずれかの方法で正規化したのちにバイト列の比較を行うことにより、文字列を正しく検索することができます。
ただし、これらの正規化は、一方通行であるため、正規化した文字列から、もとの正規化されていない文字列を復元することは不可能ですので、注意が必要です。
正規化により変化する文字に注意
正規化することにより、文字列が危険なバイト列に変化することがある点にも注意が必要です。
例えば、‥ は、NFKD および NFKC で正規化することにより、.. すなわち、".." という上位ディレクトリを表すバイト列に変化します。
また、① も、NFKC、NFKD によって 1 に変換されます。
処理系の各層の途中で文字列の正規化がなされる可能性がある場合には、正規化後の文字列が危険ではないかにも注意を払わなければなりません。