2013-04-04 51 views
6

有人可以用法語語言環境來解釋sort命令的行爲嗎?爲什麼排序命令在法語區域設置中對「œ」和「oe」無差別地排序?

$ file file.txt 
file.txt: UTF-8 Unicode text, with CRLF line terminators 

$ wc -l file.txt 
4 file.txt 

$ cat file.txt 
cœz 
coez 
coe 
cœ 

$ sort file.txt 
coe 
cœ 
cœz 
coez 

$ sort -d file.txt 
cœ 
coe 
coez 
cœz 

$ env | grep -P "(LC|FR)" 
LANG=fr_FR.UTF-8 

事實上,「OE」是小於或大於「OE」似乎在常規排序的情況下,隨機的,而字符在字典排序(sort -d)的情況下,簡單地忽略。

我想這與整理有關,但我想在這裏有一些見解。

+1

您確定您位於法語區域嗎? '$ LC_ALL'的價值是什麼? – unwind 2013-04-04 14:10:41

+0

我在Windows下使用cygwin。 LC_ALL是空的。我的猜測是法語區域這個事實,我該如何檢查它? – 2013-04-04 14:12:18

+0

如果「œ」與「oe」完全等價,那麼結果可以用這種不穩定性來解釋。查看在給出'-s'選項時得到的結果。 – 2013-04-04 15:13:57

回答

1

字典排序可能會忽略 - 連字,因爲它不在ascii中的範圍a-zA-Z中。 (這是一個猜測)。

然後在法國語言環境中,和oe相當,所以他們應該按照他們進入的順序出來,這就是你正在發生的事情。如果這是正確的,那麼,如果你把這個在:

cœz 
coez 
cœm 
coem 
coep 
cœp 
coe 
cœ 

你應該得到這樣的:

coe 
cœ 
cœm 
coem 
coep 
cœp 
cœz 
coez 

可以使用-c(檢查文件排序)或-r(逆序)選項得到更多。

+0

我同意字典排序。但我不同意爲什麼和oe會比較平等,我想知道爲什麼選擇這種行爲。有人知道嗎? – 2013-04-04 15:45:38

+1

@btoueg,排序函數的行爲是匹配預先存在的約定,它不是由實現者選擇的。基本上,因爲''''和'oe'是寫同一個東西的兩種不同的方式 - 它比語言差異更像是印刷差異。 – Ben 2013-04-04 15:51:58

+0

確實,連字字符在字典中是無差別排序的: http://fr.wikipedia.org/wiki/Classement_alphab%C3%A9tique#Ligatures_et_majuscules 但是,您可以看到結尾的重音字符已排序: http:// en.wikipedia.org/wiki/Alphabetical_order#Language-specific_conventions 有趣的是,當你有重複的時候,這不會發生在字典裏,這個順序對於計算機來說是完全隨機的。這不是您想要的行爲,因爲它是您可以利用的信息,例如拼寫。 – 2013-04-04 17:12:44