3

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

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

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

然后,假设我这两个字符串是:

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

在“Secondary”排序规则下,string1 应该排在 string2 之前。其中 string1 和 string2 是根据它们的次要强度进行比较的。

<1 hello
<2 héllo

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

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

那么重音 hello (string2) 将放在 string1 之前。并且,两者都在它们的主要重量上进行比较。

<1 héllo  
<1 hello 

为什么unicode 排序算法会考虑尾随空格?

这背后有什么原因吗?

4

3 回答 3

4

这是一个老问题,但我将来会为其他人回答。

最初的“他们”是国际标准化组织,它发布了 ISO-14651,这是一个用于在任何编码方案中整理文本的标准,但目标是支持 Unicode。该标准在很大程度上独立于实施。

然后 Unicode Consortium 发布了 Unicode Collat​​ion Algorithm,它与 ISO-14651 兼容,但在实现细节方面走得更远。

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

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

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

大多数字符在比较之前都进行了标准化。因此,带重音的 'á' 将被标准化为 'a' 以进行 1 级比较。Level-2 用作决胜局。

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

有关非常详细的说明,请参阅Unicode Collat​​ion Algorithm

于 2019-10-01T22:15:18.043 回答
1

最好的 TP 可能就是这个了

您可以使用ICU Collat​​ion Demo尝试各种选项组合。(试试“alternate=shifted”)

于 2014-12-05T14:52:19.680 回答
0

因为空格字符的主要排序规则权重为 0x0209。(参考Default Unicode Collat​​ion Element Table,搜索# SPACE

空格,无论是否尾随,都是字符串的一部分。

于 2014-12-04T19:29:11.447 回答