我无法计算String
中有一些代理字符的长度吗?
我的字符串是,
String val1 = "\u5B66\uD8F0\uDE30";
问题是,\uD8F0\uDE30
是一个字符而不是两个字符,因此String
的长度应为2
。
但是当我计算String
val1.length()
的长度时,它会将3
作为输出,这是完全错误的。如何解决问题并获得String
的实际长度?
答案 0 :(得分:9)
您可以使用codePointCount(beginIndex, endIndex)
来计算String
中的代码点数,而不是使用length()
。
val1.codePointCount(0, val1.length())
请参阅以下示例
String val1 = "\u5B66\uD8F0\uDE30";
System.out.println("character count: " + val1.length());
System.out.println("code points: "+ val1.codePointCount(0, val1.length()));
<强>输出强>
character count: 3
code points: 2
仅供参考,您无法使用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)));
}
给出,
character at 0: 23398
character at 1: 311856
您可以使用val1.codePoints()
,它会返回序列中所有代码点的IntStream
。
由于您对String
的长度感兴趣,请使用
val1.codePoints().count();
打印代码点,
val1.codePoints().forEach(a -> System.out.println(a));