unicode整理排序背后的理论是什么?

时间:2014-12-04 19:00:15

标签: icu uca

unicode排序背后的理论是什么? 我理解它是如何工作的,但我不明白为什么they决定使用这个标准进行整理排序。

似乎当你有两个字符串要比较时,使用ucol_strcolliter()例如:

ucol_strcollIter(collator, &stringIter1, &stringIter2, &Status)

然后,说我的两个字符串是:

string string1 = "hello"
string string2 = "héllo"

在“辅助”归类强度下,string1应在string2之前排序。其中string1和string2的次要强度进行比较。

<1 hello
<2 héllo

BUT

如果您有尾随空格,例如:

string string1 = "hello  "
string string2 = "héllo "

然后重音的hello(string2)将放在string1之前。并且,两者都按其主要重量进行比较。

<1 héllo  
<1 hello 

为什么 unicode整理算法会考虑尾随空格吗?

这背后有原因吗?

3 个答案:

答案 0 :(得分:1)

这是一个古老的问题,但以后我会为其他人回答。

最初的“他们”是国际标准化组织,该组织发布了ISO-14651,ISO-14651是一种以任何编码方案整理文本的标准,但其目的是支持Unicode。该标准在很大程度上与实现无关。

然后,Unicode联合会发布了Unicode排序算法,该算法与ISO-14651兼容,但在实现细节方面要走得多。

排序规则取决于语言排序规则,并且排序规则类通常将语言环境作为参数。如前所述,默认排序顺序在DUCET中定义。如果您使用ICU4J库,它将与DUCET同步。

比较算法基于至少三个级别,以符合ISO-14651。级别定义如下。

  1. 基本字符(例如a,b,c,d)
  2. 口音
  3. 案例/变体
  4. 标点
  5. 完全相同

大多数字符在比较前已标准化。因此,将重音符号“á”归一化为“ a”以进行1级比较。 Level-2用作决胜局。

存在默认规则是有原因的,但是可以针对个别用例进行定制。请注意,语言的排序方式不同,排序顺序通常与Unicode中字符出现的顺序不匹配。语言排序顺序不等于二进制排序顺序。

有关详细说明,请参见Unicode Collation Algorithm

答案 1 :(得分:0)

因为空格字符的主要归类权重为0x0209。 (参考Default Unicode Collation Element Table,搜索# SPACE

空格,是否有尾随,是字符串的一部分。

答案 2 :(得分:0)

最好的TP可能是this

您可以尝试使用ICU Collation Demo的各种选项组合。 (给“替代=转移”尝试)