仅字母排序规则(原为:Emacs 中的奇怪文件排序与我的语言环境有关)
Posted
技术标签:
【中文标题】仅字母排序规则(原为:Emacs 中的奇怪文件排序与我的语言环境有关)【英文标题】:Letter-only collation (was: Weird file ordering in Emacs dired with my locale) 【发布时间】:2015-12-12 09:03:30 【问题描述】:我刚刚注意到。这是令人毛骨悚然的。但这是我的截图。所以请帮帮我吧!
TL;DR
问题在底部。
症状
-rw-r--r-- 1 jb jb 24287 mars 21 2012 array.c
-rw-r--r-- 1 jb jb 28767 oct. 1 2014 arrayfunc.c
-rw-r--r-- 1 jb jb 2895 mai 11 2012 arrayfunc.h
-rw-rw-r-- 1 jb jb 4030 mars 29 2009 array.h
-UUU:%%--F1 bash-4.3.30 6% L9 (Dired by name)---------------------
(这是emacs -nw
屏幕截图。是的,我的终端有 6 行高。它使屏幕截图更切中要害。语言环境是法语,这是意料之中的。它与英语没有什么不同,想象一下有一个“may”而不是“mai”,月份大写并截断为三个字符)
如果你错过了,它是 dired
模式,文件应该按名称排序(在模式行中这样说)但 array.c
和 array.h
不在一起!
恐慌
我在寻找array.c
,光标在下面,所以哇老兄它在一分钟前在哪里。然后我真的找到了。然后我检查模型行。然后我去WTF我问SO。然后我注意到它是法语的,他们永远不会理解更好的使用LC_ALL=C
截取新屏幕截图。
但这解决了问题。
(是的,它真的发生了。)
所以这是一个语言环境
我的语言环境是fr_FR.UTF-8
$ ls ar* | $ LC_ALL=C ls ar*
array.c | array.c
arrayfunc.c | array.h
arrayfunc.h | arrayfunc.c
array.h | arrayfunc.h
(那时我删除了emacs 标签并开始怀疑是否有人真的关注collation)
似乎这是常态
我将省去神秘的 shell 调用,但它的要点是:在我在这里安装的 29 个语言环境中,除了三个之外,所有语言都使用“奇怪”的顺序。这三个是:C、C.UTF-8 和 POSIX。
这是不言而喻的,但无论如何提及它并没有什么坏处:“奇怪”的排序让我感到不安,但它有其自身的意义:在这个小样本集上,它像往常一样按字典顺序排序,只是忽略了句号。所以arrayc
arrayfarrayh.
问题
为什么?为什么? WHY??? 除了 C 语言,它在所有语言环境中都有,所以这是故意的。这是基于什么规则?某个委员会中的某个人是否竖立并定罪:“您在整理时不得遵守标点符号”?可能有一些合法的严肃文件,他们说这是完全正常的,这就是为什么,对吧?
这么多年来我第一次注意到。
当然,它也会忽略空格。
奖励:这是来自 gnu.org 的 bash-4.3.30 tarball。为什么有些文件是 0664 而有些是 0644?将答案保存在 cmets 中。 另外:我不是在问如何解决它。如果您没有注意到,我已经修复真的不需要修复它。另外,这到处都是骗子。我要问的是为什么。
【问题讨论】:
(setenv "LC_COLLATE" "C")
在您的 emacs 初始化文件中?不过还是不知道为什么会这样排序……
【参考方案1】:
回答:Unicode 联盟得出的结论是,无论“可变”字符如何,保证排序顺序比在字符串中包含每个字符更重要。
详情:我相信您正在寻找的答案在于:
Unicode Technical Standard #10: Unicode Collation Algorithm
如果我理解正确,标点符号(除其他外,如空格)在语言之间是“可变的”,因此为了确保跨语言的排序顺序相同,“可变”字符的“权重”非常低在排序;经常解析到权重为零,因此对排序完全没有影响。
UTS 确实表明可以按用户自定义排序。
不幸的是,大多数系统只使用默认值,这导致只有少数排序规则定义赋予“可变”字符同等权重;并且不真正支持用户调整默认值,以便他们使用标点符号和空格进行 UTF-8 排序,包含而不是排除。
如果我正确地遵循了理性,请考虑对名称进行排序。在许多文化和语言中,名字总是在姓氏之前给出,当颠倒时,姓氏与名字之间用标点符号分隔。在其他文化中,情况正好相反。
lastname, firstname
lastname firstname
和
firstname lastname
firstname, lastname
为确保每个列表始终按相同顺序排序,标点符号将被忽略。
【讨论】:
以上是关于仅字母排序规则(原为:Emacs 中的奇怪文件排序与我的语言环境有关)的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何仅使用Java中的util.Scanner包按字母顺序对单个字符串进行排序?