这可以看作是 GNU libc 语言环境的一个错误。在大多数其他系统上,语言环境确保所有不同的字符最终具有不同的排序顺序。在 GNU 语言环境中,情况变得更糟,因为有数千个字符没有排序顺序并最终排序相同,从而导致各种问题(例如中断comm、join或ls具有不确定顺序的全局... ),因此建议使用LC_ALL=C来解决这些问题。
*** WARNING *** The locale specified by the environment affects sort
order. Set LC_ALL=C to get the traditional sort order that uses native
byte values.
不,它不认为它们是等效的,它们只是具有相同的主要权重。因此,在第一个近似值中,它们的排序相同。
如果您在 GNU 系统(此处使用 glibc 2.27)上查看 /usr/share/i18n/locales/iso14651_t1_common (用作大多数语言环境的基础),您会看到:
e
,ɛ
并且E
具有相同的主要权重e
和E
相同的次要权重,只有第三个权重可以区分它们。比较字符串时,
sort
(strcoll()
标准的 libc 函数用于比较字符串)首先比较所有字符的主要权重,如果字符串与主要权重相等,则仅使用第二个权重(以此类推其他权重) .这就是在第一个近似值的排序顺序中似乎忽略大小写的方式。在and
Ab
之间排序,但可以根据语言规则在之前或之后排序(有些语言在英国英语中之前有,有些在爱沙尼亚语中之前有)。aa
ac
Ab
ab
<MIN>
<CAP>
<CAP>
<MIN>
如果
e
具有与 相同的排序顺序ɛ
,则printf '%s\n' e ɛ | sort -u
仅返回一行。但作为<BAS>
前排<PCL>
,e
单独前排ɛ
。eɛe
排序后EEE
(在次要权重),即使EEE
排序后eee
(为此我们需要上升到第三个权重)。现在,如果在我的系统上使用 glibc 2.27,我运行:
您会注意到有相当多的字符被定义为完全相同的 4 个权重。特别是,我们的 ɛ 具有与以下相同的权重:
果然:
这可以看作是 GNU libc 语言环境的一个错误。在大多数其他系统上,语言环境确保所有不同的字符最终具有不同的排序顺序。在 GNU 语言环境中,情况变得更糟,因为有数千个字符没有排序顺序并最终排序相同,从而导致各种问题(例如中断
comm
、join
或ls
具有不确定顺序的全局... ),因此建议使用LC_ALL=C
来解决这些问题。正如@ninjalj 在评论中指出的那样,2018 年 8 月发布的 glibc 2.28 在这方面进行了一些改进,尽管 AFAICS 仍然有一些字符或排序元素定义为相同的排序顺序。在带有 glibc 2.28 和 en_GB.UTF-8 语言环境的 Ubuntu 18.10 上。
(为什么 U+00B7 仅在与
L
/结合时才被视为等同于 U+0387l
?!)。和:
(仍然有超过 100 万个字符(Unicode 范围的 95%,低于 2.27 中的 98%)排序与其他字符相同,因为它们的排序顺序未定义)。
也可以看看:
男人排序:
所以,试试:
LC_ALL=C sort file.txt
字符 ɛ 不等于 e,但某些语言环境可以在整理时将这些符号聚集在一起。其原因是特定于语言的,但也有一些历史甚至政治背景。例如,大多数人可能期望欧元货币在字典中接近欧洲。
无论如何,要查看您当前使用
locale
的排序规则,locale -a
它将为您提供系统上可用的语言环境列表,并将排序规则更改为C
仅用于一次排序运行LC_COLLATE=C sort file
。最后看看不同的语言环境如何对您的文件进行排序尝试将结果传送到一些 greping 工具以选择适合您需要的语言环境。