2016-01-25 55 views
3

我發現Java的char和codepoint的區別是奇怪的和不合適的。澄清Java對Unicode的進化支持

例如,一個字符串是一個字符或「字母出現在字母表中」的數組;與可能是單個字母或可能是複合或代理對的代碼點相反。但是,Java將字符串的字符定義爲char,該字符不能是複合的或包含代碼點的替代項,並且可以作爲int(這很好)。

但是然後length()似乎返回代碼點的數量,而codePointCount()也返回代碼點的數量,而是結合複合字符..最終不是真正的代碼點的實際計數?

感覺好像charAt()應返回String,使複合材料和代理人沿帶和length()結果應與codePointCount()交換。

最初的實現感覺有點倒退。它的設計方式是否有其原因?

更新:codePointAt()codePointBefore()

另外值得一提的是,codePointAt()codePointBefore()接受指數作爲參數,但該指數的行爲對字符,並有一系列的0length() - 1,因此不是基於如字符串中的代碼點數量一樣,可以假設。

更新:equalsIgnoreCase()

String.equalsIgnoreCase()使用術語normalization來形容前比較字符串它做什麼。這是一個誤稱,因爲在Unicode字符串的上下文中規範化可能意味着完全不同的東西。他們的意思是說他們使用案例摺疊。

+1

自從Java 1.0以來,Unicode在其疣體上發展了疣? – chrylis

+0

你說得對。多一點搜索提供了這個:http://programmers.stackexchange.com/questions/174947/why-does-java-use-utf-16-for-internal-string-representation?answertab=votes#tab-top – Zhro

+0

值得注意的是,你讀的API錯誤'但是,然後length()似乎返回碼點數''。從JDK7 API中,它表示「長度等於字符串中Unicode代碼單元的數量」。請注意,它是「Unicode代碼單元」而不是「代碼點」 –

回答