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 - 通过可分割的槽 Activity 获取特定领域

java - Client SocketInputStream.close() 导致更多的资源消耗?

java - 多线程似乎不起作用

python - 从文本文件读取时的 Unicode 编码

java - JTextArea 中的 Unicode 字符未正确显示

python - 将 dict 的键和值从 str 转换为 Unicode 的最快方法?

python - 使用Python获取字符的unicode代码点

unicode - 为什么红心表情符号需要两个代码点,而其他彩色心形表情符号需要一个?

java - Spring RestTemplate.getForObject() 的 JSON 转换错误

c++ - 如何使用 C++ 或调用 winapi 查找字符是否属于特定代码页