我在 Java 10 中处理 Unicode 字符。
我正在使用 java.text.BreakIterator 包。
对于此输出:
myString="a𝓞b" hex=0061d835dcde0062
myString.length()=4
myString.codePointCount(0,s.length())=3
BreakIterator output:
a hex=0061
𝓞 hex=d835dcde
b hex=0062
看起来是正确的。
使用相同的 Java 代码,然后使用以下输出:
myString="G̲íl" hex=0047033200ed006c
myString.length()=4
myString.codePointCount(0,s.length())=4
BreakIterator output:
G̲ hex=00470332
í hex=00ed
l hex=006c
看起来也正确,除了 codePointCount=4。
为什么不是3,有没有办法获得
不使用 BreakIterator 的 3 值?
我的目标是确定字符串的所有(输出)字符是否都是 16 位,或者是否存在代理或组合字符?
最佳答案
“G̲íl”是四个代码点:U+0047、U+0332、U+00ED、U+006C。
U+0332 是一个组合字符,但它是一个单独的代码点。这与您的第一个示例不同,第一个示例需要使用代理对(2 个 UTF-16 代码单元)来表示 U+1D4DE - 但后者仍然是单个代码点。
BreakIterator
查找文本中的边界 - 此处组合的两个代码点在这种意义上没有边界。来自文档:
Character boundary analysis allows users to interact with characters as they expect to, for example, when moving the cursor through a text string. Character boundary analysis provides correct navigation through character strings, regardless of how the character is stored.
所以我认为这里一切正常。
关于java - 在 Java 中,如何处理 Unicode 字符和 Java UTF-16 代码点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55172840/