【问题标题】: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 个字节)吗?

标签: string stream java-8


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 2014-04-21
  • 2023-01-16
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多