在Java字符串处理时,在使用length和charAt方法时,应该格外小心,因为length返回的是UTF-16编码表示下的代码单元数量,而非我们所认为的字符的个数,charAt方法返回的是指定位置处的代码单元,而非我们所认为的字符。
至于为什么都是“代码单元”而非字符,这和Unicode字符集的增补相关,具体的参看下面的附录。
要想获得字符串中的字符的个数,应当使用aString.codePointCount(0, aString.length());要想获得指定位置处的字符,使用aString.codePointAt(i);需要注意codePointAt的返回值,是int而非char。
枚举字符串的正确方法:
for (int i = 0; i < aString.length();) {
int character = aString.codePointAt(i);
if (Character.isSupplementaryCodePoint(character)) i += 2;
else ++i;
}
将codePoint转换为char[]可调用Character.toChars方法,然后可进一步转换为字符串:
String s(Character.toChars(codePoint));
转载地址:
深入学习Java中的字符串,代码点和代码单元
网友评论