GNU sort 使用 UTF-8 对 URL 的处理 - 记录在哪里?

GNU sort 使用 UTF-8 对 URL 的处理 - 记录在哪里?

这让我心痛:

echo -e "http://z.com\nhttps://a.com" | sort

vs.

echo -e "http://z.com\nhttps://a.com" | LC_ALL=C sort

在 UTF-8 下排序时,排序似乎忽略了 http 与 https。但真正让我抓狂的是我找不到关于这种行为的任何文档。有人可以指点我吗?

答案1

C语言环境下,sort按原始字节给出的顺序排序;在语言en_US环境中,sort按文化上适当的词典顺序排序:

  • C语言环境中:

    http://z排序在前,https://a因为':'(58) 小于's'(115)。

  • en_US语言环境中:

    https://a排序在前面,http://z因为美式英语词典顺序忽略分隔符,因此字符串会按照httpsa和进行排序httpz,并且显然s位于 之前z

man 1 sort说:

     ***  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.

要仅更改排序顺序,您可以设置LC_COLLATE环境变量:

$ echo -e 'ab:d\nabc:d' | LC_COLLATE=en_US.UTF-8 sort
abc:d
ab:d

$ echo -e 'ab:d\nabc:d' | LC_COLLATE=C.UTF-8 sort
ab:d
abc:d

注意:环境变量LC_ALL优先于详细LC_变量。

相关内容