带有代理字符的字符串的长度 - java

bhu*_*esh 1 java

我无法计算我的长度中String有一些代理字符吗?

我的字符串是,

String val1 = "\u5B66\uD8F0\uDE30";
Run Code Online (Sandbox Code Playgroud)

问题是,\uD8F0\uDE30一个字符不是两个,所以String应该是长度2.

但是当我计算我的长度,String因为val1.length()它给人3的输出,这是完全错误的.我该如何解决问题并获得实际长度String

Suf*_*ori 9

您可以使用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使用codePointAtoffsetByCodePoints(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)

对于Java 8

您可以使用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)