我發現Java的char和codepoint的區別是奇怪的和不合適的。澄清Java對Unicode的進化支持
例如,一個字符串是一個字符或「字母出現在字母表中」的數組;與可能是單個字母或可能是複合或代理對的代碼點相反。但是,Java將字符串的字符定義爲char
,該字符不能是複合的或包含代碼點的替代項,並且可以作爲int
(這很好)。
但是然後length()
似乎返回代碼點的數量,而codePointCount()
也返回代碼點的數量,而是結合複合字符..最終不是真正的代碼點的實際計數?
感覺好像charAt()
應返回String
,使複合材料和代理人沿帶和length()
結果應與codePointCount()
交換。
最初的實現感覺有點倒退。它的設計方式是否有其原因?
更新:codePointAt()
,codePointBefore()
另外值得一提的是,codePointAt()
和codePointBefore()
接受指數作爲參數,但該指數的行爲對字符,並有一系列的0
到length() - 1
,因此不是基於如字符串中的代碼點數量一樣,可以假設。
更新:equalsIgnoreCase()
String.equalsIgnoreCase()使用術語normalization
來形容前比較字符串它做什麼。這是一個誤稱,因爲在Unicode字符串的上下文中規範化可能意味着完全不同的東西。他們的意思是說他們使用案例摺疊。
自從Java 1.0以來,Unicode在其疣體上發展了疣? – chrylis
你說得對。多一點搜索提供了這個:http://programmers.stackexchange.com/questions/174947/why-does-java-use-utf-16-for-internal-string-representation?answertab=votes#tab-top – Zhro
值得注意的是,你讀的API錯誤'但是,然後length()似乎返回碼點數''。從JDK7 API中,它表示「長度等於字符串中Unicode代碼單元的數量」。請注意,它是「Unicode代碼單元」而不是「代碼點」 –