比较中文unicode字符串,当多个代码点是同一字符时?

Rob*_*b N 5 unicode normalization cjk unicode-normalization

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

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

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

所以我想知道:

  1. 是否在某处有重复的unicode字符列表,以便在尝试比较字符串之前可以对其进行转换?
  2. 在处理CJK字符时这是正常现象吗,还是我做错了其他事?

tch*_*ist 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}
Run Code Online (Sandbox Code Playgroud)

许多基本的 Unicode 工具(包括那些)都可以在这里找到。