我很难理解 unicode 排序顺序。
当我Collator.getInstance(Locale.ENGLISH).compare("_", "#")
在 ICU4J 55.1 下运行时,我得到一个返回值,-1
表明它_
在#
.
但是,查看http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec我看到#
(U+0023) 在_
(U+005F) 之前。为什么 ICU4J 返回值-1
?
我很难理解 unicode 排序顺序。
当我Collator.getInstance(Locale.ENGLISH).compare("_", "#")
在 ICU4J 55.1 下运行时,我得到一个返回值,-1
表明它_
在#
.
但是,查看http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=dec我看到#
(U+0023) 在_
(U+005F) 之前。为什么 ICU4J 返回值-1
?
首先,UTF-8 只是一种编码。它指定如何物理存储 Unicode 代码点,但不处理排序、比较等。
现在,您链接到的页面以数字代码点顺序显示所有内容。如果使用二进制排序规则,这就是排序的顺序(在 SQL Server 中,这将是名称以_BIN
and结尾的排序规则_BIN2
)。但是非二进制排序要复杂得多。此处描述了规则:Unicode 排序算法 (UCA)。
基本规则可以在这里找到:http ://www.unicode.org/repos/cldr/tags/release-28/common/uca/allkeys_CLDR.txt
表明:
005F ; [*010A.0020.0002] # LOW LINE
...
0023 ; [*0290.0020.0002] # NUMBER SIGN
请记住,任何语言环境/文化都可以覆盖这些基本规则,这一点非常重要。因此,虽然上面提到的几行解释了这种特定情况,但其他情况需要检查http://www.unicode.org/repos/cldr/tags/release-28/common/collation/以查看是否有任何语言环境- 特定的覆盖。
将 Mark Ransom 的评论转换为答案:
_
是 is 005F ; [*020B.0020.0002] # LOW LINE
while #
is 0023 ; [*0391.0020.0002] # NUMBER SIGN
。请注意,排序规则编号_
低于 的编号#
。