我发现 ASCII 的排序结果:
源文件test
:
1-
11-
1-a
11-a
使用 ASCII 排序:
$ LANG=en_US.ascii sort test
1-
1-a
11-
11-a
使用 UTF-8 的话:
$ LANG=en_US.utf8 sort test
1-
11-
11-a
1-a
我觉得这太违反直觉了,而且这不符合字典的顺序。
字符 '-' ( 002d
) 不是总是小于[0-9]
( 0030-0039
) 吗?UTF-8 排序的一般规则是什么?
并且在 Linux 中如何绕过它,只需使其-
小于,同时保持其他字符对于 UTF-8 保持不变?(因此它会影响、等[0-9]
的结果。)ls --sort
sort
答案1
减号在第一遍中被忽略。因此第一遍对 、 、 、 进行排序1
。11
由于1a
< 11a
,1
因此a
得到11a
< 1a
,从而得到11-a
< 1-a
。
-
是变量排序元素,这意味着您/实现者可以选择忽略它。glibc 实现显然是这样做的。实际上,大多数标点符号都会受到此行为的影响。
你可以在Unicode 排序算法,模数 glibc 如何实现它。
答案2
正如 Peter Eisentraut 所解释的,这是因为 Unicode 的排序算法-
在排序时忽略了。
解决这个问题的唯一方法是定义您自己的语言环境,并使用不同的排序规则(排序规则)。但这并非易事。此外,这会给您的系统带来不寻常的排序规则,这可能会导致其他软件出现问题。
因此实际上,您要么将您的语言环境切换为 ASCII(如果您不需要 Unicode 字符),要么使用可以直接配置排序规则的程序进行排序。