在 utf-8 排序规则中,为什么 11- 小于 1-?

在 utf-8 排序规则中,为什么 11- 小于 1-?

我发现 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 --sortsort

答案1

减号在第一遍中被忽略。因此第一遍对 、 、 、 进行排序111由于1a< 11a1因此a得到11a< 1a,从而得到11-a< 1-a

-变量排序元素,这意味着您/实现者可以选择忽略它。glibc 实现显然是这样做的。实际上,大多数标点符号都会受到此行为的影响。

你可以在Unicode 排序算法,模数 glibc 如何实现它。

答案2

正如 Peter Eisentraut 所解释的,这是因为 Unicode 的排序算法-在排序时忽略了。

解决这个问题的唯一方法是定义您自己的语言环境,并使用不同的排序规则(排序规则)。但这并非易事。此外,这会给您的系统带来不寻常的排序规则,这可能会导致其他软件出现问题。

因此实际上,您要么将您的语言环境切换为 ASCII(如果您不需要 Unicode 字符),要么使用可以直接配置排序规则的程序进行排序。

相关内容