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

rob*_*man 3 sort locale

这让我心痛:

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

vs.

echo -e "http://z.com\nhttps://a.com" | LC_ALL=C sort
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*exP 5

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

  • C语言环境中:

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

  • en_US语言环境中:

    https://a排序之前,http://z因为美式英语词典顺序忽略了分隔符,因此字符串被整理成好像它们是httpsaand 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.
Run Code Online (Sandbox Code Playgroud)

要仅更改排序顺序,您可以设置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
Run Code Online (Sandbox Code Playgroud)

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

  • @robbie.huffman:它不仅忽略冒号和斜杠,还忽略大多数分隔符,例如空格。实际上,它并没有忽略它们,而是仅将它们用作区分字符串的最后手段。在 Debian 等中,查看语言环境定义文件 `/usr/share/i18n/locales/en_US`;该文件从`iso14651_t1`复制整理序列([`ISO 14651`](https://en.wikipedia.org/wiki/ISO_14651)是描述字符串比较规则的国际标准);再多一层间接,你就会得到实际的整理规则,其中空格、冒号和斜杠被定义为可忽略的分隔符。 (2认同)