AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 762342
Accepted
nneonneo
nneonneo
Asked: 2023-11-25 19:05:21 +0800 CST2023-11-25 19:05:21 +0800 CST 2023-11-25 19:05:21 +0800 CST

为什么 ls 按长度对中文文件名排序?

  • 772

我遇到了一些奇怪的行为,我无法完全理解ls中文文件名。我运行的是 macOS 13.6.1,启用了 SIP(​​无核心操作系统修改),安装了 MacPorts,并将美国英语作为主要语言。

首先,在空白文件夹中运行这个小脚本来创建一些测试文件:

import random

random.seed(42)

for i in range(30):
    n = random.randrange(3, 8)
    fn = "".join(random.choice("一二三") for _ in range(n))
    open(fn, "w")

这使得 30 个文件以字符一二三(一、二、三)的随机组合命名。

接下来,我在我的 Mac 上运行ls -l(根据手册页,版本为“macOS 13.5”):

% ls -l
total 8
-rw-r--r--@ 1 brx  staff  164 Nov 25 02:41 test.py
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一一三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三三一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二一二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一一三一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三三一三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三三三三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三二三一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三二二三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二一一一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二一三三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二三三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三一三一一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三二一三二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三三二三一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一二一一三三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一二三二一一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二一一三三二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二三二三二三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二二一一二一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二二三二一二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二一一一一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二一一一二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一三二三三三一
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 一二一三二三三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 三一一二二二三
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二三三二三二二
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 二三二一二二一

这些文件显然是按文件名长度排序的,但在其他方面不是在相同的长度内排序的,就好像ls将所有汉字视为完全相同一样。

LANG设置为en_US.UTF-8(并且没有LC_*设置变量),所以也许这只是英文排序的问题?

% LANG=zh_CN.utf-8 ls -l
total 8
-rw-r--r--@ 1 brx  staff  164 11 25 02:41 test.py
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一一三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三三一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二一二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一一三一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三三一三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三三三三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三二三一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三二二三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二一一一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二一三三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二三三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三一三一一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三二一三二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三三二三一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一二一一三三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一二三二一一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二一一三三二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二三二三二三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二二一一二一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二二三二一二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二一一一一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二一一一二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一三二三三三一
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 一二一三二三三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 三一一二二二三
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二三三二三二二
-rw-r--r--+ 1 brx  staff    0 11 25 02:41 二三二一二二一

是的,也许这只是Mac内置的ls蹩脚;让我们尝试一下 GNU Coreutils(来自 MacPorts,ls (GNU coreutils) 9.4):

% gls -l
total 4
-rw-r--r--+ 1 brx staff 164 Nov 25 02:41 test.py
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一一三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一一三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三一三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三一三一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二一三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三三二三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二一一三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二三二一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一一三三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三二三二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二二一一二一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二二三二一二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一一一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一一一二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二三三三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二一三二三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三一一二二二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三三二三二二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三二一二二一
% LANG=zh_CN.utf-8 gls -l
总计 4
-rw-r--r--+ 1 brx staff 164 1125日 02:41 test.py
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一一三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三三一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二一二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一一三一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三三一三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三三三三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三二三一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三二二三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二一一一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二一三三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二三三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三一三一一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三二一三二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三三二三一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一二一一三三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一二三二一一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二一一三三二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二三二三二三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二二一一二一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二二三二一二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二一一一一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二一一一二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一三二三三三一
-rw-r--r--+ 1 brx staff   0 1125日 02:41 一二一三二三三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 三一一二二二三
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二三三二三二二
-rw-r--r--+ 1 brx staff   0 1125日 02:41 二三二一二二一

除了GNU Coreutils幽默地破坏了日期显示之外,没有任何变化。唯一似乎有用的是C.utf-8:

% LANG=C.utf-8 ls -l
total 8
-rw-r--r--@ 1 brx  staff  164 Nov 25 02:41 test.py
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ???????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ???????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ???????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ?????????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
-rw-r--r--+ 1 brx  staff    0 Nov 25 02:41 ??????????????????
% LANG=C.utf-8 gls -l
total 4
-rw-r--r--+ 1 brx staff 164 Nov 25 02:41 test.py
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一一三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一一三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三三二三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一一一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二一一一二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一三二三三三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二一一三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二一三二三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 一二三二一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三一一二二二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三一三一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三一三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三三三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二一三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二三一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 三二二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一一一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一一三三二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一三三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二一二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三三二三二二
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三二一二二一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二三二三二三
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二二一一二一
-rw-r--r--+ 1 brx staff   0 Nov 25 02:41 二二三二一二

这里发生了什么?我的 Mac 上的区域设置是否损坏?

编辑:为了澄清预期的行为:我希望ls以任何合理的排序顺序对字符进行排序;一些合理的顺序是 Unicode 代码点(一、三、二)、数字或笔划数顺序(一、二、三)或拼音顺序(二、三、一,对应于“二、三、一”)。

回答评论的一些额外信息(在en_US.UTF-8语言环境中):

  • sort当通过管道传送到或gsort有或没有时,顺序保持不变-u。

  • 实际上我的系统上没有 C.utf-8 语言环境,这解释了为什么我得到与 C 语言环境中相同的输出,按字节值排序,每个字节呈现为?.

  • expr '一二三' '<' '三一二'、expr '一二三' '>' '三一二'、expr '一二三' = '三一二'分别返回 1、0 和 0,无论是使用 macosexpr还是 GNU expr。

  • perl -MPOSIX -le 'print strcoll@ARGV' -- '一' '二'输出-140是否随perlmacos 或 MacPorts 一起提供。

  • perl -MPOSIX -le 'print strcoll@ARGV' -- '一一' '二'输出19968

  • 这些字符的编码看起来像$'\344\270\200\344\270\200\344\270\211'区域设置中一一三报告的那样,因此看起来它们已正确编码为 UTF-8。glsC

  • 的输出perl -MPOSIX -le 'print unpack "H*", strxfrm$_ for @ARGV' -- '一' '一一' '二'是:

    303034323030303030346c32
    30303432303034323030303030346c3230346c32
    303034323030303030346e3e
    
  • 的输出perl -MPOSIX -le 'print "$_\t" . unpack "H*", strxfrm$_ for <*>'是

    一一三一  303034323030343230303432303034323030303030346c3230346c3230346c3b30346c32
    一一三   3030343230303432303034323030303030346c3230346c3230346c3b
    一三三二三一    3030343230303432303034323030343230303432303034323030303030346c3230346c3b30346c3b30346e3e30346c3b30346c32
    一三二一一一一   303034323030343230303432303034323030343230303432303034323030303030346c3230346c3b30346e3e30346c3230346c3230346c3230346c32
    一三二一一一二   303034323030343230303432303034323030343230303432303034323030303030346c3230346c3b30346e3e30346c3230346c3230346c3230346e3e
    一三二一  303034323030343230303432303034323030303030346c3230346c3b30346e3e30346c32
    一三二三三三一   303034323030343230303432303034323030343230303432303034323030303030346c3230346c3b30346e3e30346c3b30346c3b30346c3b30346c32
    一三二三三 30303432303034323030343230303432303034323030303030346c3230346c3b30346e3e30346c3b30346c3b
    一三二   3030343230303432303034323030303030346c3230346c3b30346e3e
    一二一一三三    3030343230303432303034323030343230303432303034323030303030346c3230346e3e30346c3230346c3230346c3b30346c3b
    一二一三二三三   303034323030343230303432303034323030343230303432303034323030303030346c3230346e3e30346c3230346c3b30346e3e30346c3b30346c3b
    一二三二一一    3030343230303432303034323030343230303432303034323030303030346c3230346e3e30346c3b30346e3e30346c3230346c32
    三一一二二二三   303034323030343230303432303034323030343230303432303034323030303030346c3b30346c3230346c3230346e3e30346e3e30346e3e30346c3b
    三一三一一 30303432303034323030343230303432303034323030303030346c3b30346c3230346c3b30346c3230346c32
    三三一三  303034323030343230303432303034323030303030346c3b30346c3b30346c3230346c3b
    三三一   3030343230303432303034323030303030346c3b30346c3b30346c32
    三三三三  303034323030343230303432303034323030303030346c3b30346c3b30346c3b30346c3b
    三二一三二 30303432303034323030343230303432303034323030303030346c3b30346e3e30346c3230346c3b30346e3e
    三二三一  303034323030343230303432303034323030303030346c3b30346e3e30346c3b30346c32
    三二二三  303034323030343230303432303034323030303030346c3b30346e3e30346e3e30346c3b
    二一一一  303034323030343230303432303034323030303030346e3e30346c3230346c3230346c32
    二一一三三二    3030343230303432303034323030343230303432303034323030303030346e3e30346c3230346c3230346c3b30346c3b30346e3e
    二一三三  303034323030343230303432303034323030303030346e3e30346c3230346c3b30346c3b
    二一二   3030343230303432303034323030303030346e3e30346c3230346e3e
    二三三二三二二   303034323030343230303432303034323030343230303432303034323030303030346e3e30346c3b30346c3b30346e3e30346c3b30346e3e30346e3e
    二三二一二二一   303034323030343230303432303034323030343230303432303034323030303030346e3e30346c3b30346e3e30346c3230346e3e30346e3e30346c32
    二三二三二三    3030343230303432303034323030343230303432303034323030303030346e3e30346c3b30346e3e30346c3b30346e3e30346c3b
    二二一一二一    3030343230303432303034323030343230303432303034323030303030346e3e30346e3e30346c3230346c3230346e3e30346c32
    二二三二一二    3030343230303432303034323030343230303432303034323030303030346e3e30346e3e30346c3b30346e3e30346c3230346e3e
    test.py   303033563030333830303355303033563030314d303033523030335f30303030303033563030333830303355303033563030314d303033523030335f
    
ls
  • 2 2 个回答
  • 111 Views

2 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2023-11-26T07:55:30+08:002023-11-26T07:55:30+08:00

    您会注意到,在相同长度的字符串中,这些字符似乎存在相对顺序,因此它们并不完全被视为等效。它不像 🧚🧛🧜 在 GNU libc 语言环境中没有定义的顺序,并且在大多数 UTF-8 语言环境中您会获得随机顺序,例如en_US.UTF-8:

    $ ls -1
    🧚🧜🧛
    🧜🧛🧚
    🧚🧚🧚
    🧜🧚🧜
    🧛🧚🧛
    🧛🧚🧜
    🧚🧜🧚
    🧚🧚🧜
    🧜🧜🧚
    🧚🧚🧜🧚
    🧜🧜🧚🧚
    🧜🧛🧛🧜
    🧜🧛🧜🧚
    🧛🧚🧜🧜
    🧜🧛🧚🧜🧛
    🧜🧜🧛🧜🧚
    🧚🧚🧚🧛🧛
    🧜🧜🧜🧚🧜
    🧚🧚🧜🧜🧛
    🧜🧜🧛🧜🧛
    🧚🧚🧜🧛🧚
    🧜🧛🧚🧛🧛
    🧜🧚🧜🧚🧜
    🧚🧛🧜🧛🧚🧚
    🧛🧛🧚🧚🧛🧚
    🧜🧛🧚🧛🧛🧚
    🧛🧛🧜🧜🧜🧚
    🧚🧛🧚🧚🧜🧜
    🧛🧜🧛🧜🧛🧜
    test.py
    $ ls -1 | sort -u
    🧚🧜🧛
    🧚🧚🧜🧚
    🧜🧛🧚🧜🧛
    🧚🧛🧜🧛🧚🧚
    test.py
    

    您得到的排序顺序与对由具有相同主排序规则权重但不同后续权重的字符组成的字符串进行排序时得到的排序顺序相同。

    例如,在大多数语言环境中,e、E和具有相同的主要权重,É这é是有充分理由的。例如,这就是如何Stéphane排序STÉPHANE之前Stephen,即使Stephane排序之前。Stéphane

    EeE
    eeé
    eéE
    éée
    Eeee
    eeée
    Eeéé
    eéEe
    éEEé
    éEée
    ééeé
    éééé
    eéEéé
    éEeéE
    éeéee
    EEeeEe
    eEeeéé
    EeeééE
    eEéEee
    EEéEeE
    EéEéEé
    eééEée
    eEeéEéé
    eéEeeee
    eéEeeeE
    EéEeEEe
    eéEééée
    EééEéEE
    éeeEEEé
    

    (请注意,所有e、E和 都é具有相同的主要权重,e并且E也具有相同的次要权重)

    从您的结果来看strxfrm(),它看起来实际上是我们可以解码为的 ASCII 文本:

    一一三          004200420042000004l204l204l;
    一三二          004200420042000004l204l;04n>
    三三一          004200420042000004l;04l;04l2
    二一二          004200420042000004n>04l204n>
    一一三一        0042004200420042000004l204l204l;04l2
    一三二一        0042004200420042000004l204l;04n>04l2
    三三一三        0042004200420042000004l;04l;04l204l;
    三三三三        0042004200420042000004l;04l;04l;04l;
    三二三一        0042004200420042000004l;04n>04l;04l2
    三二二三        0042004200420042000004l;04n>04n>04l;
    二一一一        0042004200420042000004n>04l204l204l2
    二一三三        0042004200420042000004n>04l204l;04l;
    一三二三三      00420042004200420042000004l204l;04n>04l;04l;
    三一三一一      00420042004200420042000004l;04l204l;04l204l2
    三二一三二      00420042004200420042000004l;04n>04l204l;04n>
    一三三二三一    004200420042004200420042000004l204l;04l;04n>04l;04l2
    一二一一三三    004200420042004200420042000004l204n>04l204l204l;04l;
    一二三二一一    004200420042004200420042000004l204n>04l;04n>04l204l2
    二一一三三二    004200420042004200420042000004n>04l204l204l;04l;04n>
    二三二三二三    004200420042004200420042000004n>04l;04n>04l;04n>04l;
    二二一一二一    004200420042004200420042000004n>04n>04l204l204n>04l2
    二二三二一二    004200420042004200420042000004n>04n>04l;04n>04l204n>
    一三二一一一一  0042004200420042004200420042000004l204l;04n>04l204l204l204l2
    一三二一一一二  0042004200420042004200420042000004l204l;04n>04l204l204l204n>
    一三二三三三一  0042004200420042004200420042000004l204l;04n>04l;04l;04l;04l2
    一二一三二三三  0042004200420042004200420042000004l204n>04l204l;04n>04l;04l;
    三一一二二二三  0042004200420042004200420042000004l;04l204l204n>04n>04n>04l;
    二三三二三二二  0042004200420042004200420042000004n>04l;04l;04n>04l;04n>04n>
    二三二一二二一  0042004200420042004200420042000004n>04l;04n>04l204n>04n>04l2
    

    你可以看到这0042很可能是这些一二三字符的主要权重的表示,并且对于所有 3 个字符来说都是相同的。然后可能有一个 0000 分隔符,从它的外观来看,只有一个额外的(辅助)权重,即04n>,04l;并且04l2对于分别为二 (U+4E8C)、三 (U+4E09) 和一 (U+4E00)1。

    Why their collation order is defined like that I don't know. It's not the case on GNU systems where in most locales, the primary weights for U+4E00 to U+9FA5 are different and in sequence of their Unicode code point. Nor is it the case on FreeBSD 12.4-RELEASE-p5 at least.

    It's also possible (even likely) that what we're seeing above is that those characters have an undefined primary weight and the 0042 we're seeing is the secondary weight. Which would explain why we seem to see only two weights per character in the strxfrm() result.

    That means that in the first pass of comparing strings that happen to contain those characters, those characters are just ignored for the purpose of comparison. That's normally the case for blank or punctuation characters where you don't want them to have a strong influence on the order. For instance foo-bar would sort between fooargh and football and the secondary and further weights of - would only be used to determine the relative order of foo-bar and foo+bar for instance.

    Apple might have decided that since not everybody agrees on the order of those characters, we might as well ignore them.


    ¹ Interesting to note (though it doesn't shed any light on this issue) is that 19968 is 0x4E00 suggesting the last weight is based on the code point. 04l2, 04l;, 04n> and even 0042 in the strxfrm strings seem to be numbers in some sort of base 64 with 0123...lmno as the digits corresponding to those weights offset by 258 (42 in that base).

    • 5
  2. nneonneo
    2023-11-28T05:23:04+08:002023-11-28T05:23:04+08:00

    I found out where macOS stores locale files, in /usr/share/locale, and to my surprise this is how the zh_CN.UTF-8 locale is defined:

    % ls -la /usr/share/locale/zh_CN.UTF-8
    total 8
    drwxr-xr-x    8 root  wheel   256 Oct 12 04:10 .
    drwxr-xr-x  209 root  wheel  6688 Oct 12 04:10 ..
    lrwxr-xr-x    1 root  wheel    28 Oct 12 04:10 LC_COLLATE -> ../la_LN.US-ASCII/LC_COLLATE
    lrwxr-xr-x    1 root  wheel    17 Oct 12 04:10 LC_CTYPE -> ../UTF-8/LC_CTYPE
    drwxr-xr-x    3 root  wheel    96 Oct 12 04:10 LC_MESSAGES
    -r--r--r--    2 root  wheel    36 Oct 12 04:10 LC_MONETARY
    lrwxr-xr-x    1 root  wheel    25 Oct 12 04:10 LC_NUMERIC -> ../zh_CN.eucCN/LC_NUMERIC
    -r--r--r--    2 root  wheel   408 Oct 12 04:10 LC_TIME
    

    LC_COLLATE is symlinked to /usr/share/locale/la_LN.US-ASCII/LC_COLLATE. This file is just over 2KB in size, and while it is a binary file (rather than the textual format used by some other systems), it's pretty clearly defining collation for just 256 bytes:

    % xxd /usr/share/locale/la_LN.US-ASCII/LC_COLLATE
    00000000: 312e 3141 0a00 0000 0000 0101 0102 0000  1.1A............
    00000010: 0102 ffff fefe 0000 0000 0000 0000 0000  ................
    00000020: 0000 0000 0000 0000 0002 0000 0002 0000  ................
    00000030: 0003 0000 0003 0000 0004 0000 0004 0000  ................
    00000040: 0005 0000 0005 0000 0006 0000 0006 0000  ................
    00000050: 0007 0000 0007 0000 0008 0000 0008 0000  ................
    00000060: 0009 0000 0009 0000 000a 0000 000a 0000  ................
    00000070: 000b 0000 000b 0000 000c 0000 000c 0000  ................
    00000080: 000d 0000 000d 0000 000e 0000 000e 0000  ................
    00000090: 000f 0000 000f 0000 0010 0000 0010 0000  ................
    ...
    00000760: 00e9 0000 00e9 0000 00ea 0000 00ea 0000  ................
    00000770: 00eb 0000 00eb 0000 00ec 0000 00ec 0000  ................
    00000780: 00ed 0000 00ed 0000 00ee 0000 00ee 0000  ................
    00000790: 00ef 0000 00ef 0000 00f0 0000 00f0 0000  ................
    000007a0: 00f1 0000 00f1 0000 00f2 0000 00f2 0000  ................
    000007b0: 00f3 0000 00f3 0000 00f4 0000 00f4 0000  ................
    000007c0: 00f5 0000 00f5 0000 00f6 0000 00f6 0000  ................
    000007d0: 00f7 0000 00f7 0000 00f8 0000 00f8 0000  ................
    000007e0: 00f9 0000 00f9 0000 00fa 0000 00fa 0000  ................
    000007f0: 00fb 0000 00fb 0000 00fc 0000 00fc 0000  ................
    00000800: 00fd 0000 00fd 0000 00fe 0000 00fe 0000  ................
    00000810: 00ff 0000 00ff 0000 0100 0000 0100 0000  ................
    00000820: 0101 0000 0101                           ......
    

    So the problem seems to be that macOS simply does not define collation ordering for any Chinese characters at all (or really anything beyond the first 256 codepoints), even in Chinese locales.

    • 1

相关问题

  • 检查 Ubuntu 中的磁盘空间(使用 ls)

  • zsh:“ls -S”在实用程序文件夹中不起作用

  • 使用“ls”时如何将文件日期转换为特定格式

  • 管道 ls 是否与 ls -1 相同?

  • 如何使用 ls 的输出打开最后修改的文件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve