我們從一個簡單的例子開始主題:
輸入的結果為2可能會讓你意想不到葡幸,接下來請跟隨我尋找答案沈自。
Returns the length of this string. The length is equal to the number of?Unicode code units?in the string.
以上是String的length()接口的定義,length返回的是字符串中unicode格式的代碼單元個數(shù)。既然跟字符串有關疼蛾,我們就從Java字符串對象String作為突破入口。
1艺配、String與字符
翻開String的類說明察郁,我發(fā)現(xiàn)以下有關聯(lián)的信息
The?String?class represents character strings.
String是由一串字符(Character)組成的,翻開源碼你會發(fā)現(xiàn)String里的value類型是char[ ]转唉,印證這一點.
A?String?represents a string in the UTF-16 format in which?supplementary characters?are represented by?surrogate pairs?(see the section?Unicode Character Representations?in the?Character?class for more information). Index values refer to?char?code units, so a supplementary character uses two positions in a?String.
Java使用UTF-16的?supplementary characters 來實現(xiàn)?surrogate pairs皮钠。surrogate pairs字面是成對的意思,一個supplementary字符占用兩個代碼單元赠法,這里已經能回答開篇的結果了麦轰,具體可以參考我的淺談unicode。
2砖织、字符
The?Character?class wraps a value of the primitive type?char?in an object. An object of type?Character?contains a single field whose type is?char.
In addition, this class provides several methods for determining a character's category (lowercase letter, digit, etc.) and for converting characters from uppercase to lowercase and vice versa.
Character information is based on the Unicode Standard, version 6.2.0.
Java的字符是使用了Character類表示的款侵,對應的基本類型是char。Character會提供一些便捷函數(shù)如:大小寫判斷侧纯,是否為數(shù)字新锈,大小寫轉換等等。Character的規(guī)范是基于Unicode的標準眶熬。(因為上面的注釋來源于jdk8妹笆,對應的標準版本是6.2.0,具體每個jdk版本對應的unicode版本娜氏,可以到unicode的官網(wǎng)查閱)
到這里我們得到一個很關鍵的信息拳缠,Java的字符實現(xiàn)是基于unicode標準。Java的Character也在一定程度上對surrogate pairs支持贸弥,如:isHighSurrogate窟坐、isLowSurrogate、isSupplementaryCodePoint等。
3狸涌、一個字 = 幾個字符切省?
一個字到底占幾個字符呢?或者說一個字占幾個字節(jié)帕胆?這個問題是經常被提及的朝捆。這個問題在unicode的規(guī)范里(其他的就不好說了)BMP(包括大部分漢字)下,一個字 = 一個字符(由于unicode的字符是16bit懒豹,等價于2字節(jié))芙盘,而通過surrogate pairs支持的Plane下 一個字 = 兩個字符(4個字節(jié))。
4脸秽、結束
surrogate pairs規(guī)范中儒老,是固定了區(qū)間來標識高低surrogates的,那么JavaAPI中记餐,StringBuffer, StringBuilder的reverse操作會判斷這類情況驮樊,不會對這些surrogates pairs進行倒置操作。保證了語義正確片酝。但很不幸的是:在倒置字符串的操作下囚衔,可能把非surrogates pairs的字符串變?yōu)?i>surrogates pairs。這里雖然很少遇到雕沿,但理論上是確實可能遇到的练湿。本篇到這里已經結束,如有問題請給我留言审轮,謝謝你的閱讀肥哎。