2012-03-20 74 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