Gnu 排序 UTF-8 排序规则顺序不正确



我在Linux上使用GNU排序来获取UTF-8文件,但某些字符串没有正确排序。我将LC_COLLATE变量设置为 en_US。二进制中的 UTF-8。这是一个显示问题的十六进制转储。

5f ef ac 82 0a
5f ef ac 81 0a
5f ef ac 82 0a
5f ef ac 82 0a

这是四个连续的排序行。0a 是行尾。第四个字节的顺序不正确。字节值 81 不应介于 82 个值字节之间。当这显示在终端窗口中时,第二行是与其他三行不同的字符。

我怀疑这是排序命令的问题,因为它是一个 GNU 核心实用程序,它应该是坚如磐石的。知道为什么会发生这种情况吗?为什么我必须使用十六进制转储来跟踪这个问题;已经是21世纪了!

使用 LC_COLLATE=C 似乎是唯一的解决方案。

您可以通过编辑/etc/default/locale 为所有内容设置此设置

不幸的是,这丢失了 UTF-8 排序的许多有用方面,例如将重音字符放在其基本字符旁边。但它远没有libc开发人员和Unicode联盟所做的完全可怕的混乱那么令人反感。他们不理解排序的目的,不理解在连接字符串时保持排序顺序的必要性,无法理解始终产生相同顺序的需要,以及世界上几乎每个程序都依赖于此。相反,他们似乎觉得通过忽略拼写错误(!)来"排序"拼写错误(例如插入名称中间的空格)很重要。

似乎可能是

您使用的版本中的某种错误。当我执行sort(来自GNU coreutils 8.30的版本)时,它的工作原理如下:

$ printf 'x5fxefxacx82x0ax5fxefxacx81x0ax5fxefxacx82x0ax5fxefxacx82x0a' | LC_COLLATE=en_US.UTF-8 sort
_fi
_fl
_fl
_fl

这似乎按预期工作。我没有费心去尝试它是否可以成功处理 NFC 与 NFD 规范化形式,因为我自己只使用 NFC。

相关内容

  • 没有找到相关文章

最新更新