Java:String.toCharArray()与Unicode字符

8

我知道char类型无法包含Unicode字符(例如char c = '\u1023')。那么我该如何处理呢?

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

我希望将 s 转换为 CharArray 以提高性能,因为我必须循环遍历可能非常长的字符串中的每个字符,这样效率很低。任何可以实现相同结果的方法都可以。谢谢!
编辑: 实际上 char 可以包含 Unicode 字符。我只是太傻了。还是感谢那些提供帮助的人。

1
实际上,char c = '\u1023' 对我有效。 - Simiil
4个回答

11

有人告诉你 Java 中的 char 不能包含 Unicode 字符,这是错误的

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

  • 对于 char,从 '\u0000''\uffff'(包括两个极端值),即从 0 到 65535

哦,谢谢。好的,这解决了很多问题。我一定是在想其他事情。我会在几分钟内接受这个答案。(SO现在还不让我!) - Henry Thompson

5

有三件事情:

  1. 一个字符可以包含u1023。
  2. toCharArray() 方法返回的字符数组实际上与UTF-16几乎相同。
  3. 由于一个字符是16位,而Unicode跨越21位,BMP之外的字符被编码为两个代理字符。 Java 1.5及以上版本支持此类API,例如String.codePointAt(...)。如果您使用的是Java 1.4或更早版本,请查看ICU4J。

3

Java中的char与其他语言相比可以包含最多的Unicode字符,但是BMP(Basic Multilingual Plane)之外的字符会被分成多个char,独立处理这些字符可能会破坏字符串。

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

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

使用Character对象的isSurrogateisLowSurrogateisHighSurrogate方法,以防止对一对中的单个char进行更改:

Character.isSurrogate('a');

2
在Java中,char本质上是一个无符号的short类型。如果要遍历包含Unicode字符范围超出char支持范围(前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中需要使用上述模式来支持越来越普遍的超出范围的字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接