在java中,如果你有一个字符串,想遍历后修改再组装成新的字符串我们使用如下代码:

String str = new String(bytes, "UTF8"); for(int i=0; i<str.length(); i++){ //do-sth System.out.println(str.charAt(0)); }

今天看了 common-lang3 代码发现如下代码:

final char[] c = Character.toChars(Character.codePointAt(input, pos));

看 codePointAt 的说明! high-surrogate ,low-surrogate 这个的解释见知乎.简单说就是 char 类型是 16bit 的,但是 65536 个字符不足以标识所有的Unicode 字符集,有只能用两个 char(16*2bit) 来表示一个 字符,两个字节(char)中高位的是 high-surrogate 低位的就是 low-surrogate,当我们遍历一个(一般是字节转的)字符串的时候就有问题了,当我们转为字符串后重新写入字符串的时候 就导致无法解码而将字符串转换出错!正常的转换方法是 将字符串用 codePointAt 方式读取为int (int 是32bit刚好可以存储两个char),然后转成两个char 即可!正确的代码是:

for(int i=0; i<str.length();){ final char[] c = Character.toChars(Character.codePointAt(str, i)); i = i+ c.length; System.out.println(c);//打印有可能是乱码! }