Java:带有unicode字符的String.toCharArray()

时间:2011-10-04 18:14:20

标签: java string char arrays

我知道char不能包含Unicode字符(比如char c ='\ u1023')。那我该怎么做呢

    String s = "ABCDEFG\u1023";
    char[] c = s.toCharArray();

出于性能原因,我想将s转换为CharArray,因为我必须循环遍历可能非常长的字符串中的每个字符,这是低效的。任何达到相同结果的东西都可以。

非常感谢!

编辑: 实际上char可以包含unicode字符。我只是傻了。感谢那些帮助过的人。

4 个答案:

答案 0 :(得分:10)

有人告诉你,在Java char中不能包含Unicode字符,was wrong

  

整数类型的值是以下范围内的整数:

     
      
  • 对于char,从'\u0000''\uffff',包括0到0   65535
  •   

答案 1 :(得分:5)

三件事:

  1. 一个字母肯定可以拥有u1023。
  2. toCharArray()将返回一个与UTF16
  3. 几乎相同的char数组
  4. 由于char是16位,并且Unicode跨越21位,因此BMP外部的字符被编码为两个代理字符。 Java 1.5以后版本有API,例如String.codePointAt(...)。如果您使用的是Java 1.4或更早版本,请查看ICU4J。

答案 2 :(得分:1)

在Java中,char本质上是一个unsigned short。为了遍历包含char支持的范围之外的unicode字符的字符串(第一个65536),您应该使用以下模式,它将每个代码点存储为int。

for (int i = 0; i < str.length();) {
    int ch = str.codePointAt(i);
    // do stuff with ch...
    i += Character.charCount(ch);
}

Java的设计是对前65536个字符的一流支持,当时这是对C / C ++的改进,它只支持前128或256个字符的一流支持。不幸的是,这意味着Java中必须使用上述模式来支持越来越常见的超出范围的字符。

答案 3 :(得分:1)

Java char可以包含the most个Unicode字符,正如其他人已经提到的那样,但是基本多语言平面(BMP)之外的字符被分成多个char并独立处理它们可能会破坏字符串。

为安全起见,您可以将字符串拆分为字符串数组:

String[] c = s.codePoints()
    .mapToObj(cp -> new String(Character.toChars(cp)))
    .toArray(size -> new String[size]);

...或使用Character对象的isSurrogateisLowSurrogateisHighSurrogate方法来阻止更改对中的char个:{/ p>

Character.isSurrogate('a');