Theme
SD MILIEU

2018-2-25

Unicode正規化(NFC,NFD,etc…)

  • Unicode では、特定の文字を表現する方法が複数存在する場合がある
  • 例えば「ボ」という文字を表現する場合、合成文字(U+30dc)と結合文字(U+30db U+3099)の2通りの方法が存在する
  • こういう合成文字・結合文字2通りの表現方法が存在する文字をどちらかに変換する事を「Unicode 正規化」という(正確には正準等価とか互換等価とかの話があるけど一旦おいておく)
  • ちなみに正規化とは「正規化(せいきか、英: normalization)とは、データ等々を一定のルール(規則)に基づいて変形し、利用しやすくすること。(by Wikipedia)」
  • 合成文字への変換をNFC、結合文字への変換をNFDと呼ぶ
  • Mac のファイルシステムHFS+では、NFD(の変化形)を使用しているため、Mac のファイル名では「ボ」は結合文字として扱われている
  • 他にも、Mac の PDF 内の文章をコピペしたら結合文字が大量に含まれているとか…
  • HTML 上における結合文字の問題点としては、例えば結合文字としての「ボ」は Firefox で検索に引っかからない。(2018.2.25 現在)

Unicode 正規化のデモ

Demo

実際に、Unicode 正規化によって文字がどのように変換されるかデモを作成した。

Javascript ではString.prototype.normalizeで Unicode 正規化が可能。

参考

文字コード地獄秘話 第 3 話:後戻りの効かない Unicode 正規化 | ALBERT Engineer Blog