仅字母排序规则(原为: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.carray.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。

这是不言而喻的,但无论如何提及它并没有什么坏处:“奇怪”的排序让我感到不安,但它有其自身的意义:在这个小样本集上,它像往常一样按字典顺序排序,只是忽略了句号。所以arraycarrayfarrayh.

问题

为什么?为什么? 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包按字母顺序对单个字符串进行排序?

通过按字母顺序仅对一行中的一些字段进行排序来重塑 R 中的数据框

MySQL 排序规则

[华为]字符串排序

使用排序规则对马其顿字母进行排序

字符串排序