我无法计算我的长度中String有一些代理字符吗?
我的字符串是,
String val1 = "\u5B66\uD8F0\uDE30";
Run Code Online (Sandbox Code Playgroud)
问题是,\uD8F0\uDE30一个字符不是两个,所以String应该是长度2.
但是当我计算我的长度,String因为val1.length()它给人3的输出,这是完全错误的.我该如何解决问题并获得实际长度String?
您可以使用codePointCount(beginIndex, endIndex)来计算代码点的数量String而不是使用length().
val1.codePointCount(0, val1.length())
Run Code Online (Sandbox Code Playgroud)
请参阅以下示例,
String val1 = "\u5B66\uD8F0\uDE30";
System.out.println("character count: " + val1.length());
System.out.println("code points: "+ val1.codePointCount(0, val1.length()));
Run Code Online (Sandbox Code Playgroud)
产量
character count: 3
code points: 2
Run Code Online (Sandbox Code Playgroud)
仅供参考,您不能String使用charAt()任何一个来打印单个代理字符.为了打印单个增补字符从String使用codePointAt和offsetByCodePoints(index, codePointOffset),这样,
for (int i =0; i<val1.codePointCount(0, val1.length()); i++)
System.out.println("character at " + i + ": "+ val1.codePointAt(val1.offsetByCodePoints(0, i)));
}
Run Code Online (Sandbox Code Playgroud)
给,
character at 0: 23398
character at 1: 311856
Run Code Online (Sandbox Code Playgroud)
您可以使用val1.codePoints(),它返回IntStream序列中所有代码点的一个.
既然你对自己的长度感兴趣,请String使用,
val1.codePoints().count();
Run Code Online (Sandbox Code Playgroud)
打印代码点,
val1.codePoints().forEach(a -> System.out.println(a));
Run Code Online (Sandbox Code Playgroud)