u-ryo's blog

Normalizer in Java

同僚に、「JavaのNormalizer.NFCとかって何?」と聞かれたので、 調べてみました。 ITproの櫻庭さんの解説が わかりやすいかも、と思ったんですが、

互換合成 Normalize Function Compativle Composite (NFKC)

とかって、スペルミスもあるし、そもそも原典と違うじゃん、 ということに気付いて。

Canonical Equivalent(正準等価性)が「か+゛」=「が」 Compatibility Equivalent(互換等価性)が「カ」=「カ」 なので、

と読めばいいのでは?

だから例えば、「NFKC」は、 「「カ」を「カ」としてから「か+゛」→「が」にすること」

気を付けたいのは、「Compatibility Composition」というのはない! ということですね。 だからよく読むと、各所にある日本語の解説は怪しいかも、です。

文字コード地獄秘話 第3話:後戻りの効かないUnicode正規化の解説が良さげです。

groovy:000> import java.text.*
===> java.text.*
groovy:000> str = "神と神㌀㈲¼が"
===> 神と神㌀㈲¼
groovy:000> println(Normalizer.normalize(str, Normalizer.Form.NFD))
神と神㌀㈲¼
===> null
groovy:000> println(Normalizer.normalize(str, Normalizer.Form.NFC))
神と神㌀㈲¼
===> null
groovy:000> println(Normalizer.normalize(str, Normalizer.Form.NFKD))
神と神アハート()14
===> null
groovy:000> println(Normalizer.normalize(str, Normalizer.Form.NFKC))
神と神アパート()14
===> null