2013-10-20 65 views
1

Unicode字符U+FA8E CJK COMPATIBILITY IDEOGRAPH-FA8E是映射到U+641C [CJK Unified Ideographs]的兼容性字符。在Java 6 NFC正常化離開它U+FA8E,而在Java 7它確實分解它爲U+641C在Java 6和7之間是否改變了NFC標準化語義?

當運行這個小片段:

String fancyChar = "\uFA8E"; 
String normalized = Normalizer.normalize(fancyChar, Normalizer.Form.NFC); 
System.out.printf("%04x == %04x\n", (int)(fancyChar.charAt(0)), (int)(normalized.charAt(0))); 
System.out.println(fancyChar.equals(normalized)); 

在Java 6中(最新的都是Sun/Oracle和OpenJDK的版本):

fa8e == fa8e 
true 

在Java 7(最新的都是Sun/Oracle的版本和OpenJDK的):

fa8e == 641c 
false 

所以我的問題是,爲什麼有這種改變?

UNICODE NORMALIZATION FORMS看來NFC不應該用兼容性映射分解字符?

但是Oracle和OpenJDK都已經將它切換爲Java 7這一事實讓我感到驚訝。

回答

3

字符U + FA8E具有規範映射到U + 641C。關於這方面的權威性參考文獻是Unicode字符數據庫中的UnicodeData.txt文件。因此,U + FA8E的正確NFC形式是U + 641C。

所以這顯然是一個錯誤修復。它似乎也會影響同一組中的其他角色。

+0

我一直在閱讀更多內容,看起來好像我可能被名字中的「兼容性」所困惑。 –

相關問題