java - 在 Java 中,如何处理 Unicode 字符和 Java UTF-16 代码点?

标签 java unicode codepoint

我在 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/

相关文章:

java - 如何验证 jtextfield 的特定格式?

python - 使用python清理文本文件中的字符串编码问题

java - 一个字符串包含多少字节?

javascript - 使用 Javascript 查找 Unicode 字符名称

java - 如何阅读非 BMP (astral) Unicode 增补字符(代码点)

java - 谷歌文档如何在不使用 Flash 查看器的情况下显示我的 .PPT 文件?

java - 流口水时比较工作内存中的对象(事实)

java - 从 Android 设备删除内存中的文件?

java - 如何在java中使用中文和日文字符作为字符串?

unicode - Unicode 是否有定义的最大代码点数?