同僚に、「JavaのNormalizer.NFCとかって何?」と聞かれたので、
調べてみました。
ITproの櫻庭さんの解説が
わかりやすいかも、と思ったんですが、
互換合成 Normalize Function Compativle Composite (NFKC)
とかって、スペルミスもあるし、そもそも原典と違うじゃん、
ということに気付いて。
- Normalization Form D (NFD) Canonical Decomposition
- Normalization Form C (NFC) Canonical Decomposition,followed by Canonical Composition
- Normalization Form KD (NFKD) Compatibility Decomposition
- Normalization Form KC (NFKC) Compatibility Decomposition,followed by Canonical Composition
Canonical Equivalent(正準等価性)が「か+゛」=「が」
Compatibility Equivalent(互換等価性)が「カ」=「カ」
なので、
- 「Canonical Decomposition」(正準分解)を「「が」→「か+゛」にすること」
- 「Canonical Composition」(正準合成)を「「か+゛」→「が」にすること」
- 「Compatibility Composition」(互換合成)を「「カ」を「カ」とすること」
と読めばいいのでは?
だから例えば、「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))
神と神アハート(有)1⁄4か
===> null
groovy:000> println(Normalizer.normalize(str, Normalizer.Form.NFKC))
神と神アパート(有)1⁄4が
===> null