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

时间:2015-01-31 14:31:46

标签: java

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

我的字符串是,

String val1 = "\u5B66\uD8F0\uDE30";

问题是,\uD8F0\uDE30是一个字符而不是两个字符,因此String的长度应为2

但是当我计算String val1.length()的长度时,它会将3作为输出,这是完全错误的。如何解决问题并获得String的实际长度?

1 个答案:

答案 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

仅供参考,您无法使用StringcharAt()打印单个代理字符。 要从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)));
    }

给出,

character at 0: 23398
character at 1: 311856

for Java 8

您可以使用val1.codePoints(),它会返回序列中所有代码点的IntStream

由于您对String的长度感兴趣,请使用

val1.codePoints().count();

打印代码点,

val1.codePoints().forEach(a -> System.out.println(a));