在 utf-8 整理中,为什么 11- 小于 1-?

Xiè*_*léi 7 unicode ordering sorting utf-8

我发现 ASCII 中的排序结果:

源文件test

1-
11-
1-a
11-a
Run Code Online (Sandbox Code Playgroud)

使用 ASCII 排序:

$ LANG=en_US.ascii sort test
1-
1-a
11-
11-a
Run Code Online (Sandbox Code Playgroud)

并使用 UTF-8:

$ LANG=en_US.utf8 sort test
1-
11-
11-a
1-a
Run Code Online (Sandbox Code Playgroud)

我觉得这太违反直觉了,而且不是字典顺序。

字符 '-' ( 002d) 不是总是小于[0-9]( 0030-0039) 吗?UTF-8 整理的一般规则是什么?

以及如何绕过它,在 Linux中使UTF-8 的其他字符保持不变,而只需-减少然后[0-9]呢?(因此,它可以影响的结果ls --sortsort等等)

Pet*_*aut 6

在第一遍中会忽略减号。所以第一遍对1, 11, 1a, 进行排序11a。由于1< a,你得到11a< 1a,因此11-a< 1-a

-是一个可变的整理元素,这意味着您/实现者可以选择忽略它。glibc 实现显然是这样做的。在实践中,大多数标点符号都会受到这种行为的影响。

您可以阅读Unicode Collat​​ion Algorithm 中的血腥细节,以glibc 如何实现为模。