パスワードを忘れた? アカウント作成
552160 journal

umqの日記: バイト列に意味はあるのか(06)

日記 by umq

Unicode の正規形について考えてみます。
正規形(Normalization Form)は、``等価''な文字列(あるいは符号列)を同じバイト列になるように表現する形式です。

Unicode 標準では``等価''として、正規等価(Canonical Equivalent)、互換等価(Compatibility Equivalent)のふたつが規定されています。
正規等価は、文字あるいは文字を構成する符号列同士が同じであることです。
互換等価は、既存の規格との相互変換を可能にするために便宜的に用意した、既存の文字とほぼ同じ意味の文字(あるいは符号列)で、見た目などが異なっていることがほとんどです。

互いに``等価''な複数の符号列は、合成形(composition format)と分解形(decomposition format)のいずれかになります。
等価な符号列のうち、分解形のものを再帰的に選択して、謂わば最も分解された形をある正規化形式とします。等価の基準として選んだものに応じて、正規等価を基準として分解したものを``正規化形式 D(NFD)''、互換等価を基準として分解したものを``正規化形式 KD(NFKD)''と、それぞれ、呼びます。
正規化形式に分解されたものについて、規定にしたがって合成形に再帰的に置き換えたものも正規化形式とします。正規化形式 D を元に合成形の正規化形式にしたものを``正規化形式 C(NFC)''と呼び、正規化形式 KD を元に合成形の正規化形式にしたものを``正規化形式 KC(NFKC)''と呼びます。

これらの形式や正規化の手続きについての詳細は、この項の末尾にまとめてリンクしている Unicode の各仕様をあたるのがよいですが、日本語の情報では貞廣知行さんのページが、unicode.org のドキュメントで言及されている例や、修正点なども言及してあり、よくまとまってます。

正規形に変換すれば、同じ文字を表す符号列が複数あったとしても、バイト列として一意になる、というのが正規化ですが、正規化はどのようなときに必要になるのでしょうか。

正規化は、複数ある紛らわしい表記を統一するために有用なので、例えば、ファイルシステムの識別名称とか、辞書の項目名などは、常に正規化するように取り決めておくのが混同を減らすという意味でよさそうです。
# wikipedia では、項目名を NFC 正規化しているようで、正規化していない符号列で項目名を記述すると、正規化した項目名にリダイレクトされます。

とはいえ、正規形式への変換処理と等価であるかどうかの比較の順番を間違えると、処理系によっては意図しない処理が実行されるようなこともあるので、注意が必要です。

参考

[ひとつまえ]

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...