Unicode 为什么';ICU4J是否匹配UTF-8排序顺序?

Unicode 为什么';ICU4J是否匹配UTF-8排序顺序?,unicode,utf-8,icu4j,Unicode,Utf 8,Icu4j,我很难理解unicode排序顺序 当我运行ICU4J 55.1下的Collator.getInstance(Locale.ENGLISH).compare(““,“#”)时,我得到一个-1的返回值,指示位于之前 然而,我看到#(U+0023)在(U+005F)之前。为什么ICU4J返回值-1?将Mark Ransom的评论转换为答案: 单个字符的排序基于排序表,排序表与代码点编号几乎没有关系。见: 如果您遵循该页面上的第一个链接,它将导致默认排序规则顺序 特别地,\uuu是005F;[*020

我很难理解unicode排序顺序

当我运行ICU4J 55.1下的
Collator.getInstance(Locale.ENGLISH).compare(““,“#”)
时,我得到一个
-1
的返回值,指示
位于
之前


然而,我看到
#
(U+0023)在
(U+005F)之前。为什么ICU4J返回值
-1

将Mark Ransom的评论转换为答案:


  • 单个字符的排序基于排序表,排序表与代码点编号几乎没有关系。见:
  • 如果您遵循该页面上的第一个链接,它将导致默认排序规则顺序
  • 特别地,
    \uuu
    005F;[*020.0020.0002]#低端
    #
    0023;[*0391.0020.0002]#数字符号
    。请注意,
    的排序规则编号低于
    的编号

首先,UTF-8只是一种编码。它指定如何物理存储Unicode代码点,但不处理排序、比较等

现在,您链接到的页面以数字代码点顺序显示所有内容。这是使用二进制排序规则(在SQL Server中,排序规则的名称以
\u-BIN
\u-BIN2
结尾)进行排序的顺序。但非二进制排序要复杂得多。此处描述了这些规则:

基本规则如下所示:

它表明:

005F;[*010A.0020.0002]#低端
...
0023  ; [*0290.0020.0002]#数字符号

请记住,任何地区/文化都可以覆盖这些基本规则,这一点非常重要。因此,虽然上面提到的几行解释了这种特定情况,但其他情况需要检查是否存在任何特定于语言环境的覆盖。

单个字符的顺序基于排序表,它与代码点编号几乎没有关系。开始请参阅。@markransem在哪里可以找到美国英语的排序表?unicode规范非常繁重,我找不到它的引用。如果您遵循该页面中的第一个链接,它将导致
allkeys.txt
,这将给出默认的排序规则顺序<代码>是
005F;[*020.0020.0002]#低端
#
0023;[*0391.0020.0002]#数字符号
。请注意,
\
的数字低于
\
@MarkRansom的数字。我相信这回答了我的问题。请发布一个正式的答案,我会标记为接受马克赎金接近,但不是100%。我将在30-45分钟后发布答案。。。