如何调试或跟踪“LC_COLLATE=en_US.UTF-8 ls -l”的排序?

如何调试或跟踪“LC_COLLATE=en_US.UTF-8 ls -l”的排序?

en_US.UTF-8 区域设置中出现意外的排序顺序解释了 UTF 排序的基础知识)

考虑这个测试场景:

# touch abc{.{g,t,t.t},@.s,-{s-w,t.c}}
# LC_COLLATE="en_US.UTF-8" ls -l test
total 0
-rw-r--r-- 1 root root 0 May  8 08:52 abc.g
-rw-r--r-- 1 root root 0 May  8 08:52 [email protected]
-rw-r--r-- 1 root root 0 May  8 08:52 abc-s-w
-rw-r--r-- 1 root root 0 May  8 08:52 abc.t
-rw-r--r-- 1 root root 0 May  8 08:52 abc-t.c
-rw-r--r-- 1 root root 0 May  8 08:52 abc.t.t

我原以为“所有点”或“所有减号”都会首先排序,但结果看起来像是一个有趣的混合物。使用的软件包是

coreutils-8.25-13.7.1.x86_64
glibc-2.22-100.8.1.x86_64
glibc-locale-2.22-100.8.1.x86_64

使用LC_COLLATE=POSIX“正确”排序的结果:

# ls -l test
total 0
-rw-r--r-- 1 root root 0 May  8 08:52 abc-s-w
-rw-r--r-- 1 root root 0 May  8 08:52 abc-t.c
-rw-r--r-- 1 root root 0 May  8 08:52 abc.g
-rw-r--r-- 1 root root 0 May  8 08:52 abc.t
-rw-r--r-- 1 root root 0 May  8 08:52 abc.t.t
-rw-r--r-- 1 root root 0 May  8 08:52 [email protected]

一些细节:

# locale -k LC_COLLATE
collate-nrules=0
collate-rulesets=""
collate-symb-hash-sizemb=0
collate-codeset="ANSI_X3.4-1968"
# LC_COLLATE="en_US.UTF-8" locale -k LC_COLLATE
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2707
collate-codeset="UTF-8"

有没有办法像一些详细的跟踪或调试消息一样“解释”排序?它不一定是命令ls,但一些简单的演示代码也可以。

是否有 UTF-8 的安全替代方案,LC_COLLATE这有点“更传统”,意思是:我可以安全地使用LC_COLLATE=POSIX它吗?

相关内容