5

中国語の文字を扱う Java コードを書いているところ、予期しない結果が得られました。等しいはずの文字列が等しくありませんでした。これは問題のある文字の 1 つで、「6」を意味します (ピンイン: liù): 六. この文字は、次の 2 つのコード ポイントのいずれかで表すことができます。

ブロック内の F9D1: CJK Compatibility Ideographs
ブロック 内の 516D: CJK Unified Ideographs

ウィキペディアにはこれらの文字範囲に関するページがあり、互換性表意文字に関する短いセクションではいくつかの重複について言及されていますが、リストではこの特定の文字が省略されています。

だから私は疑問に思っています:

  1. 重複するユニコード文字のリストがどこかにあるので、文字列を比較する前に変換できますか?
  2. CJK 文字を扱う場合、これは正常なことですか? それとも何か間違ったことをしたのでしょうか?
4

1 に答える 1

3

それらを正規化するだけです。U+F9D1 は、次の 4 つの正規化スキームのいずれかの下で U+516D になります。

$ export PERL_UNICODE=S

$ perl -le 'print "\x{F9D1}\x{516D}"' | uniquote -v
\N{CJK COMPATIBILITY IDEOGRAPH-F9D1}\N{CJK UNIFIED IDEOGRAPH-516D}

$ perl -le 'print "\x{F9D1}\x{516D}"' | nfd | uniquote -v
\N{CJK UNIFIED IDEOGRAPH-516D}\N{CJK UNIFIED IDEOGRAPH-516D}
$ perl -le 'print "\x{F9D1}\x{516D}"' | nfc | uniquote -v
\N{CJK UNIFIED IDEOGRAPH-516D}\N{CJK UNIFIED IDEOGRAPH-516D}
$ perl -le 'print "\x{F9D1}\x{516D}"' | nfkd | uniquote -v
\N{CJK UNIFIED IDEOGRAPH-516D}\N{CJK UNIFIED IDEOGRAPH-516D}
$ perl -le 'print "\x{F9D1}\x{516D}"' | nfkc | uniquote -v
\N{CJK UNIFIED IDEOGRAPH-516D}\N{CJK UNIFIED IDEOGRAPH-516D}

それらを含む多くの重要な Unicode ツールは、ここから入手できます。

于 2012-03-20T22:31:43.117 に答える