5

我正在编写一些处理汉字的 Java 代码,并且得到了一些意想不到的结果——应该相等的字符串不是。这是其中一个令人反感的字符,意思是“六”(拼音:liù):六。这个字符可以用两个代码点之一来表示:

块中的 F9D1:CJK 兼容表意文字
块中的 516D:CJK 统一表意文字

维基百科有一个关于这些字符范围的页面,关于兼容性表意文字的简短部分确实提到了一些重复,但列表省略了这个特定字符。

所以我想知道:

  1. 某处是否有重复的 unicode 字符列表,以便我可以在尝试比较它们之前转换字符串?
  2. 处理 CJK 字符时这是正常的,还是我做错了什么?
4

1 回答 1

3

只是将它们标准化。在四种归一化方案中的任何一种下,U+F9D1 变为 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 回答