2012-03-20 75 views
4

我正在写一些处理中文字符的Java代码,并且我得到了一些意想不到的结果 - 应该相等的字符串不是。这是一个有问题的人物,意思是“六”(pinyin:liù):六。比较中文unicode字符串,当多个代码点是相同的字符?

F9D1在块:CJK Compatibility Ideographs
在块516D:CJK Unified Ideographs

维基百科具有page有关这些字符范围,和兼容性表意文字短段该字符可以用以下两种码点来表示确实提到了一些重复,但列表忽略了这个特定的字符。

所以我想知道:

  1. 是否有重复的Unicode字符列表的地方,所以我可以尝试比较之前转换字符串?
  2. 与日韩文字打交道时,还是我做别的东西错的是这正常吗?

回答

2

只是正常化他们。 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} 

多种人体必需的统一工具,包括那些,可here

+0

谢谢。我在类java.text.Normalizer中找到了Java的等价物。 – 2012-03-20 22:55:41

+0

@RobN是的,正好。对不起,我没有提到;我原以为你会知道它已经在哪里了。我只是想表明规范化需要照顾它。 – tchrist 2012-03-20 22:59:00