Java 需要UTF-16代理项对测试哪些好的Unicode代码点?

Java 需要UTF-16代理项对测试哪些好的Unicode代码点?,java,c#,unicode,utf-16,icu,Java,C#,Unicode,Utf 16,Icu,许多编程系统,如ICU、Java、COM和CLR,在处理过程中使用UTF-16对字符串数据进行编码。在这些系统中暴露错误相对比较困难,因为常用字符位于基本多语言平面内,因此只需要一个编码单元就可以在UTF-16中编码 以前我使用过表情符号,例如,摩门教徒在19世纪开发的是在BMP之外编码的,但由Unicode中被视为字母的字符组成,与其他一些古代脚本(如乌加里特或埃及象形文字)不同,Deseret是一个大小写脚本,意思是每个字母都有大小写变体 使用Deseret进行测试揭示了Java在处理Un

许多编程系统,如ICU、Java、COM和CLR,在处理过程中使用UTF-16对字符串数据进行编码。在这些系统中暴露错误相对比较困难,因为常用字符位于基本多语言平面内,因此只需要一个编码单元就可以在UTF-16中编码

以前我使用过表情符号,例如,摩门教徒在19世纪开发的是在BMP之外编码的,但由Unicode中被视为字母的字符组成,与其他一些古代脚本(如乌加里特或埃及象形文字)不同,Deseret是一个大小写脚本,意思是每个字母都有大小写变体

使用Deseret进行测试揭示了Java在处理Unicode方面的一些缺陷。例如,
s1.equalsIgnoreCase(s2)
其中s1和s2是包含相同反序列化字母的大小写版本的字符串,返回false,因为
equalsIgnoreCase
方法无法正确处理代理项对

编辑后添加:我刚刚通过查看“瓦朗花旗”或维基百科上的拼写发现了另一个。这是一种约有一百万印度人使用的语言的案例脚本


不区分大小写的古代脚本通常也在BMP之外,例如Lydian、腓尼基语和亚拉姆语。

equalsIgnoreCase一直被设计为比较字符串中单个Java
char
值。现在对其进行更改将打破其原有的合同,尽管这将是一种功能上的改进。另一方面,
s1.toLowerCase().compareTo(s2.toLowerCase())
将正确处理反序列化大小写。@VGR我知道这是可行的。我只想指出,
equalsIgnoreCase,
的当前行为虽然与文档一致,但却违反了最小惊讶原则,很难想象任何依赖于当前行为的正确代码。@David:问题是,依赖于当前行为的错误代码如果被更改,可能会变得更加不正确。我见过很多代码进入无限循环,而开发人员期望出现不区分区域性的行为,但却对区域性敏感(@Billy我正在尝试,但无法想象代码当前会期望
equalsIgnoreCase
为Desert或Warang Citi返回不正确的结果,如果它开始做正确的事情,它就会崩溃。但我认为可以引入一种新的不区分大小写的比较方法。@David:啊,说得好。我知道的案例不是这样的当输入具有不同的规范化形式时,或当一个字符串或另一个字符串具有零宽度空格或类似字符串时,类hings等于返回true。