java 8 String.chars() 是不是适用于 8 字节字符?
Posted
技术标签:
【中文标题】java 8 String.chars() 是不是适用于 8 字节字符?【英文标题】:Does java 8 String.chars() work properly with 8 byte chars?java 8 String.chars() 是否适用于 8 字节字符? 【发布时间】:2016-08-21 01:49:42 【问题描述】:由于 java 8 String.chars() 返回一个 IntStream,如果你想要一个字符流,我发现的最佳答案是强制转换 i -> (char) i,我想知道是否有人知道这是否正常工作使用实际占用 8 个字节的 UTF-16 字符?
【问题讨论】:
8 个字节?不是所有的 Unicode 字符最多都适合两个 UTF-16 代码单元(即 4 个字节)吗? 【参考方案1】:取决于您对正确的定义:不,它没有。
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
,但这是一个不同的问题)。
但是有 8 字节的字符吗?最多应为 4 个字节,至少在 UTF-16 中。
您在@Thilo 的回答中看到您可以调用 .codePoints() 而不是 chars() 将代理对折叠成一个 int 吗?
@tumunu:您不能“将 8 个字节填充到 32 位值中”,因为 8 个字节是 64 位。 Unicode 代码点使用 21 位,甚至可以放入三个字节,但对于处理它们,通常使用由 四个 字节组成的 int
s,您可以在 Java 中使用 String.codePoints()
来执行此操作,您可能被忽略了,因为它继承自CharSequence
。以上是关于java 8 String.chars() 是不是适用于 8 字节字符?的主要内容,如果未能解决你的问题,请参考以下文章
Java 8 的 ZoneOffset 是不是考虑了夏令时?