【发布时间】:2016-03-30 08:44:32
【问题描述】:
我称自己为 POSIX shell 向导。但今天我把屎塞进裤子里了。
所以这没什么奇怪的:
bash# printf 'v10\nv1.' | sort
v1.
v10
因为. 的代码为0x2e,而0 的代码为0x30。但是这个怎么样:
bash# printf 'v101\nv1.1' | sort
v101
v1.1
WTF?好的,我是巫师:
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_DK.utf8
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=
所以:
bash# printf 'v101\nv1.1' | LC_ALL=C sort
v1.1
v101
语言环境/排序规则如何生成"v101" < "v1.1"?
我认为en_US.UTF-8 语言环境有整理规则来去除. 符号。这个测试表明我有观点:
bash# printf 'v102\nv1.01' | LC_ALL=en_US.UTF-8 sort
v1.01
v102
bash# printf 'v102\nv1.03' | LC_ALL=en_US.UTF-8 sort
v102
v1.03
我说的对吗?如果我是对的,谁不喜欢圆点? UTF-8 还是说英语的人还是美国人?
这是 POSIX 兼容的行为吗?
【问题讨论】:
-
是的,比较时忽略一些字符是有效的。稍微相关的 WTF 时刻:stackoverflow.com/questions/34225675/…
-
请告诉我,你的回忆录的标题是“好吧,我是巫师”,其中有一章的标题是“今天我的裤子里有屎”。 +1
标签: bash sorting posix locale collation