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

我正在写一些处理中文字符的
Java代码,我得到了一些意想不到的结果 – 应该相等的字符串不是.这是一个令人不快的角色,意思是“六”(拼音:liù):六.该字符可以用两个代码点中的任何一个表示:

块中的F9D1:CJK Compatibility Ideographs
区块中的516D:CJK Unified Ideographs

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

所以我想知道:

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

最佳答案 只是将它们标准化. 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工具,包括那些,都可以使用here.

点赞