所以我知道 String#codePointAt(int)
,但它是由 char
偏移量而不是代码点偏移量索引的。
我正在考虑尝试类似的东西:
- 使用
String#charAt(int)
char
- 测试
char
是否在 高代理范围内- 如果是这样,使用
String#codePointAt(int)
获取代码点,并将索引递增 2 - 如果不是,则使用给定的
char
值作为代码点,并将索引递增 1
- 如果是这样,使用
但我担心的是
- 我不确定自然在高代理范围内的代码点是否将存储为两个
char
值或一个 - 这似乎是一种非常昂贵的遍历字符的方法
- 一定有人想出了更好的办法。
原文由 rampion 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,Java 对字符串的内部表示使用 UTF-16 式编码,而且,是的,它使用代理方案对基本多语言平面 ( BMP ) 之外的字符进行编码。
如果您知道您将处理 BMP 之外的字符,那么这里是迭代 Java String 字符的规范方法: