一尘不染

如何遍历Java字符串的unicode代码点?

java

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

我正在考虑尝试类似的方法:

  • 使用String#charAt(int)得到char的指数
  • 测试是否char在高替代范围内
  • 如果是这样,请使用String#codePointAt(int)以获得代码点,并将索引增加2
  • 如果不是,则使用给定char值作为代码点,并将索引增加1

但是我担心的是

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

阅读 421

收藏
2020-03-11

共1个答案

一尘不染

是的,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);
}
2020-03-11