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

Bcw*_*mot 2 java unicode codepoint

我正在用Java 10来处理Unicode字符。
我正在使用java.text.BreakIterator包。对于此输出:

myString="ab"  hex=0061d835dcde0062
myString.length()=4 
myString.codePointCount(0,s.length())=3
BreakIterator output:
    a    hex=0061           
        hex=d835dcde          
    b    hex=0062
Run Code Online (Sandbox Code Playgroud)

似乎正确。

使用相同的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  
Run Code Online (Sandbox Code Playgroud)

似乎也正确,除了codePointCount = 4。
为什么不是3,并且有没有使用BreakIterator来获得3值的方法?

我的目标是确定字符串的所有(输出)字符是否都是16位,还是存在替代字符还是组合字符?

Jon*_*eet 5

“Gíl” 是四个代码点:U + 0047,U + 0332,U + 00ED,U + 006C。

U + 0332是一个组合字符,但它是一个单独的代码点。这与您的第一个示例不同,后者需要使用一个代理对(2个UTF-16代码单元)来表示U + 1D4DE-但后者仍然是单个代码点。

BreakIterator在文本中找到边界- 结合在一起的两个代码点在这种意义上没有边界。从文档中:

字符边界分析使用户可以按照他们期望的方式与字符进行交互,例如,当在文本字符串中移动光标时。字符边界分析提供了在字符串中的正确导航,无论字符如何存储。

因此,我认为这里一切正常。