【问题标题】:length of a String with surrogate characters in it - java带有代理字符的字符串的长度 - java
【发布时间】:2015-01-31 14:31:46
【问题描述】:

我无法计算其中包含一些代理字符的 String 的长度?

我的字符串是,

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

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

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

【问题讨论】:

    标签: java


    【解决方案1】:

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

    仅供参考,您也不能使用charAt()String 打印单个代理字符。 为了从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
    

    适用于 Java 8

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

    既然您对String 的长度感兴趣,请使用,

    val1.codePoints().count();
    

    打印代码点,

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

    【讨论】:

      猜你喜欢
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      相关资源
      最近更新 更多