u-ryo's blog

various information for coding...

Category: Unicode

Normalizer in Java

| Comments

同僚に、「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正規化の解説が良さげです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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