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