Java8String.chars()是否可以与8字节字符一起正常工作?

Java8String.chars()是否可以与8字节字符一起正常工作?,string,stream,java-8,String,Stream,Java 8,由于Java8 String.chars()返回一个IntStream,如果您想要一个字符流,我发现最好的答案是通过强制转换I->(char)I,我想知道是否有人知道这是否适用于实际占用8字节的UTF-16字符 取决于您对的定义:不,它不正确 Javachar是一个16位UTF-16代码单元。任何比这个长的都表示为两个char() 这同样适用于String#length()。它将返回字符数,因此您的“长字符”将计为两个 返回IntStream的原因是。包含的数据仍将在char16位范围内 然而,

由于Java8 String.chars()返回一个IntStream,如果您想要一个字符流,我发现最好的答案是通过强制转换I->(char)I,我想知道是否有人知道这是否适用于实际占用8字节的UTF-16字符

取决于您对的定义:不,它不正确

Java
char
是一个16位UTF-16代码单元。任何比这个长的都表示为两个
char
()

这同样适用于
String#length()
。它将返回
字符数
,因此您的“长字符”将计为两个

返回
IntStream
的原因是。包含的数据仍将在
char
16位范围内


然而,除了
chars()
,还有
.codePoints()
,它返回32位Unicode码点(也作为
IntStream
)。

你所说的“解析”是什么意思?这是不可能发生的。每个
char
产生一个
IntStream
条目。您只需执行一个
charx=(char)i
来“转换”。(一些Unicode字符表示为两个
字符,但这是另一个问题)。但是否有8字节字符?至少在UTF-16中应该最多为4个字节。您在@Thilo的回答中看到可以调用.codePoints()而不是chars(),后者将代理项对折叠为一个int吗?@tumunu:您不能“将8个字节填充为32位值”,因为8个字节是64位的。Unicode代码点使用21位,甚至可以放入三个字节,但为了处理它们,通常使用由四个字节组成的
int
s,这可以在Java中使用
String.codepoints()
,您可能忽略了这一点,因为它是从
CharSequence
.8字节继承而来的?难道所有Unicode字符最多只能容纳两个UTF-16代码单元(即4字节)吗?