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 位,甚至可以放入三个字节,但对于处理它们,通常使用由 四个 字节组成的 ints,您可以在 Java 中使用 String.codePoints() 来执行此操作,您可能被忽略了,因为它继承自CharSequence

以上是关于java 8 String.chars() 是不是适用于 8 字节字符?的主要内容,如果未能解决你的问题,请参考以下文章

利用uuid生成8位随机数

字符串

统计字符串里每个词语的数目

Java 8 的 ZoneOffset 是不是考虑了夏令时?

Java 8 的新 Java 日期时间 API 是不是负责 DST?

您是不是有 Java 8 功能接口列表(不是 java.util.function 中列出的接口)?