为何单个字符‘𐍉’对应的String.length()返回值为2?
为什么Java中字符‘𐍉’的String.length()返回2?
这是由Java字符串的底层编码逻辑和length()方法的定义共同决定的:
- Java的
String内部采用UTF-16编码存储字符。Unicode字符分为两个范围:基本多语言平面(BMP,编码范围U+0000到U+FFFF)和补充平面(编码范围U+10000到U+10FFFF)。字符‘𐍉’的Unicode编码是U+10349,属于补充平面字符,超出了BMP的范围。 - 按照UTF-16的编码规则,BMP内的字符用1个16位的代码单元(Code Unit)表示,而补充平面的字符需要用两个16位代码单元组成的代理对(高代理项+低代理项)来表示。
String.length()方法的返回值是字符串中UTF-16代码单元的数量,而非实际Unicode字符(Code Point)的数量。‘𐍉’作为补充平面字符,占用2个UTF-16代码单元,因此length()返回2。
如果要获取实际的Unicode字符数量,可以使用codePointCount()方法:
int actualCharCount = chars.codePointCount(0, chars.length()); // actualCharCount 的值为1
内容的提问来源于stack exchange,提问作者newman
相关产品推荐
相关产品推荐

