【发布时间】:2014-11-08 05:49:29
【问题描述】:
我试图让 Perl 和 GNU/Linux sort(1) 程序就如何对 Unicode 字符串进行排序达成一致。我正在使用LANG=en_US.UTF-8 运行sort。在 Perl 程序中我尝试了以下方法:
-
use Unicode::Collate与$Collator = Unicode::Collate->new(); -
use Unicode::Collate::Locale与$Collator = Unicode::Collate->new(locale => $ENV{'LANG'}); use locale
它们中的每一个都因以下错误而失败(来自 Perl 方面):
- 输入未排序:[----,] 位于 [($1] 之后
- 输入未排序:[...] 在 [&] 之后
- 输入未排序:[($1] 位于 [1] 之后
对我有用的唯一方法是为 sort 设置 LC_ALL=C,并在 Perl 中使用 8 位字符。但是,这样一来,Unicode 字符串就没有正确排序。
【问题讨论】:
-
你打电话给
sort了吗? Unicode::Collate 不会改变sort的默认行为;您必须使用自定义比较功能。 -
实际的 Perl 代码(对于 8 位字符)位于 github.com/dspinellis/sgsh/blob/master/sgsh-merge-sum.pl。它旨在合并多个
sort | uniq -c调用的输出。 -
请注意
sort使用LC_COLLATE,而不是LANG。 -
这是意料之中的。如果未定义,则优先级为 LC_COLLATE,如果未定义 LANG,则为 LC_ALL。见pubs.opengroup.org/onlinepubs/007908799/xbd/envvar.html
标签: perl sorting unix unicode locale