如何遍历 Java String 的 unicode 代码点?

新手上路,请多包涵

所以我知道 String#codePointAt(int) ,但它是由 char 偏移量而不是代码点偏移量索引的。

我正在考虑尝试类似的东西:

但我担心的是

  • 我不确定自然在高代理范围内的代码点是否将存储为两个 char 值或一个
  • 这似乎是一种非常昂贵的遍历字符的方法
  • 一定有人想出了更好的办法。

原文由 rampion 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 493
2 个回答

是的,Java 对字符串的内部表示使用 UTF-16 式编码,而且,是的,它使用代理方案对基本多语言平面 ( BMP ) 之外的字符进行编码。

如果您知道您将处理 BMP 之外的字符,那么这里是迭代 Java String 字符的规范方法:

 final int length = s.length();
for (int offset = 0; offset < length; ) {
   final int codepoint = s.codePointAt(offset);

   // do something with the codepoint

   offset += Character.charCount(codepoint);
}

原文由 Jonathan Feinberg 发布,翻译遵循 CC BY-SA 3.0 许可协议

Java 8 添加了 CharSequence#codePoints 返回一个 IntStream 包含代码点。您可以直接使用流来迭代它们:

 string.codePoints().forEach(c -> ...);

或者通过将流收集到数组中来使用 for 循环:

 for(int c : string.codePoints().toArray()){
    ...
}

这些方法可能比 Jonathan Feinbergs 的解决方案 更昂贵,但它们的读/写速度更快,并且性能差异通常是微不足道的。

原文由 Alex - GlassEditor.com 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题