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

Gnu排序UTF-8排序顺序不正确,utf-8,gnu-sort,Utf 8,Gnu Sort,我在Linux上对UTF-8文件使用GNU排序,有些字符串排序不正确。我在BASH中将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个字节之间。当这显示在终端窗口中时,第二行是与其他三行不同的字符 我怀疑这是sort命令的问题,因为它是一个GNU

我在Linux上对UTF-8文件使用GNU排序,有些字符串排序不正确。我在BASH中将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个字节之间。当这显示在终端窗口中时,第二行是与其他三行不同的字符


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

使用LC\u COLLATE=C似乎是唯一的解决方案

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


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

使用LC\u COLLATE=C似乎是唯一的解决方案

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


不幸的是,这丢失了UTF-8排序的许多有用方面,例如将重音字符放在基本字符旁边。但它远没有libc开发人员和Unicode联盟所做的那样令人讨厌。他们无法理解排序的目的、串接时保持排序顺序的需要、始终产生相同顺序的需要,以及世界上几乎每个程序都依赖于此。相反,他们似乎觉得重要的是对拼写错误进行“排序”,比如在名字中间插入空格,忽略它们(!).

非编程问题属于SE上的一个或多个操作系统特定站点-检查哪一个适合您的需要。非编程问题属于SE上的一个或多个操作系统特定站点-检查哪一个适合您的需要。