【问题标题】:Why does sort -u treat U+2161 and U+2162 as the same character?为什么 sort -u 将 U+2161 和 U+2162 视为同一个字符?
【发布时间】:2012-12-27 17:56:35
【问题描述】:

我有一个文件,每行有两个字符:

$ cat roman
Ⅱ
Ⅲ

当我用sort -u对该文件进行排序时,只显示一行:

$ sort -u roman
Ⅱ

是代码点 U+2161, 是代码点 U+2162。为什么只显示一行?

编辑

$ xxd -g 1 roman
0000000: e2 85 a1 0a e2 85 a2 0a                          ........


$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_US.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
LC_ALL=

我的sort 属于 GNU coreutils。

$ sort --version
sort (GNU coreutils) 8.15
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and Paul Eggert.

【问题讨论】:

  • 您能否提供文件的 hexdump,并转储您的语言环境和排序规则相关的环境变量?
  • 那么,解决办法是什么?
  • @UniMouS - 这是哪个版本的排序? BSD排序? GNU 排序?还有什么?
  • @UniMouS, LC_COLLATE,你已经包括在内,是主要的。 unix.stackexchange.com/questions/35469/… 解释了 UTF-8 排序如何忽略一些代码点,但我不知道为什么它会忽略数字(字母)类别中的代码点。

标签: linux sorting unicode gnu-coreutils


【解决方案1】:

尝试设置LC_COLLATE=C;那能解决吗?这对我有用:

$ export LANG=en_US.UTF-8
$ export LANGUAGE=en_US:en
$ export LC_CTYPE="en_US.UTF-8"
$ export LC_NUMERIC=en_US.UTF-8
$ export LC_TIME=en_US.UTF-8
$ export LC_COLLATE="en_US.UTF-8"
$ export LC_MONETARY=en_US.UTF-8
$ export LC_MESSAGES="en_US.UTF-8"
$ export LC_PAPER=en_US.UTF-8
$ export LC_NAME=en_US.UTF-8
$ export LC_ADDRESS=en_US.UTF-8
$ export LC_TELEPHONE=en_US.UTF-8
$ export LC_MEASUREMENT=en_US.UTF-8
$ export LC_IDENTIFICATION=en_US.UTF-8
$ export LC_ALL=
$ sort -u foo.txt |wc -l         # <-- with your env variables
1
$ export LC_COLLATE=C
$ sort -u foo.txt |wc -l         # <-- with LC_COLLATE changed to C
2

查看我的 /usr/share/i18n/locales/en_US 副本,我明白了:

LC_COLLATE
% Copy the template from ISO/IEC 14651
copy "iso14651_t1"
END LC_COLLATE

这大概是从哪里来的。不知道为什么它告诉这些要整理在一起。

【讨论】:

  • 您是执行“export LC_COLLATE=C”(如果是 bash/sh)还是“setenv LC_COLLATE=C”(csh)?在我的测试中,这是可行的(尽管我使用的是不同版本的排序)
  • 哦,它可以工作...我拼错了那个变量 :-(,但是为什么这可以工作?
  • 看看@Mike Samuel 指向你的页面:unix.stackexchange.com/questions/35469/…
猜你喜欢
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
相关资源
最近更新 更多