我遇到了一些奇怪的行为,我无法完全理解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
还是 GNUexpr
。perl -MPOSIX -le 'print strcoll@ARGV' -- '一' '二'
输出-140
是否随perl
macos 或 MacPorts 一起提供。perl -MPOSIX -le 'print strcoll@ARGV' -- '一一' '二'
输出19968
这些字符的编码看起来像
$'\344\270\200\344\270\200\344\270\211'
区域设置中一一三
报告的那样,因此看起来它们已正确编码为 UTF-8。gls
C
的输出
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
您会注意到,在相同长度的字符串中,这些字符似乎存在相对顺序,因此它们并不完全被视为等效。它不像 🧚🧛🧜 在 GNU libc 语言环境中没有定义的顺序,并且在大多数 UTF-8 语言环境中您会获得随机顺序,例如
en_US.UTF-8
:您得到的排序顺序与对由具有相同主排序规则权重但不同后续权重的字符组成的字符串进行排序时得到的排序顺序相同。
例如,在大多数语言环境中,
e
、E
和具有相同的主要权重,É
这é
是有充分理由的。例如,这就是如何Stéphane
排序STÉPHANE
之前Stephen
,即使Stephane
排序之前。Stéphane
(请注意,所有
e
、E
和 都é
具有相同的主要权重,e
并且E
也具有相同的次要权重)从您的结果来看
strxfrm()
,它看起来实际上是我们可以解码为的 ASCII 文本:你可以看到这
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 thestrxfrm()
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 betweenfooargh
andfootball
and the secondary and further weights of-
would only be used to determine the relative order offoo-bar
andfoo+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 even0042
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).I found out where macOS stores locale files, in
/usr/share/locale
, and to my surprise this is how thezh_CN.UTF-8
locale is defined: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: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.