【发布时间】:2016-08-21 01:49:42
【问题描述】:
由于 java 8 String.chars() 返回一个 IntStream,如果你想要一个字符流,我发现的最佳答案是强制转换 i -> (char) i,我想知道是否有人知道这是否正常工作使用实际占用 8 个字节的 UTF-16 字符?
【问题讨论】:
-
8 个字节?不是所有的 Unicode 字符最多都适合两个 UTF-16 代码单元(即 4 个字节)吗?
由于 java 8 String.chars() 返回一个 IntStream,如果你想要一个字符流,我发现的最佳答案是强制转换 i -> (char) i,我想知道是否有人知道这是否正常工作使用实际占用 8 个字节的 UTF-16 字符?
【问题讨论】:
取决于您对正确的定义:不,它没有。
Java char 是一个 16 位 UTF-16 代码单元。任何比这更长的都表示为两个char (as "surrogate pairs")。
String#length() 也是如此。它将返回char 的数量,因此您的“长字符”将计为两个。
返回IntStream 的原因是just to not need to introduce a CharStream class。包含的数据仍将仅在char 16 位范围内。
但是,除了chars(),还有.codePoints(),它确实返回32位Unicode代码点(也作为IntStream)。
【讨论】:
char 产生一个IntStream 条目。你可以简单地做一个char x = (char) i 来“转换”。 (一些 Unicode 字符表示为两个char,但这是一个不同的问题)。
ints,您可以在 Java 中使用 String.codePoints() 来执行此操作,您可能被忽略了,因为它继承自CharSequence。