Lua中的字符串排序

10

我正在阅读《Lua编程》第一版(是的,我知道有点过时了),在第3.2节(关于关系运算符)中,作者说:

例如,在欧洲的Latin-1区域设置中,我们有“acai”<“açaí”<“acorde”。

我不懂。对我来说,"acai" < "açaí"没问题,但为什么是"açaí" < "acorde"呢?

据我所知(维基百科也证实了),"c" < "ç",那么我错了吗?


1
我猜这是书中的错误。字符串排序是逐字母进行的,因此"acai" < "açaí" < "acorde"等同于'c' < 'ç' < 'c',这是没有意义的。 - Mud
当我读到书中的这一部分时,我也有同样的想法,而且我拥有第三版。 - nicolas.leblanc
哪个“欧洲Latin-1区域设置”?有很多... - Deduplicator
2个回答

8
在 PiL 的第三版中,该声明已被修改:
例如,在葡萄牙语 Latin-1 区域设置下,我们有“acai”<“açaí”<“acorde”。
因此,需要相应地将区域设置为葡萄牙语 Latin-1。
print("acai" < "açaí")
print("açaí" < "acorde")

print(os.setlocale("pt_PT"))

print("acai" < "açaí")
print("açaí" < "acorde")

ideone 上,结果是:
true
false
pt_PT.iso88591
false
true

但是现在书中"acai"和"açaí"的顺序似乎不同了。


1
好的。那是事实,但它并不能解释这种行为。我的意思是,为什么"acai" < "açaí""açaí" < "acorde"?正如@Kamiccolo在评论中指出的那样,lvm.c使用strcoll()函数来比较字符串,因此看起来变音符号在比较中可能不相关。 - Valdir Stumm Junior
@Yu和@Stu,"açaí" < "acorde"这个比较结果是不正确的(正如@YuHao指出的那样)。事实上,我也认为书中可能存在一个打字错误。正确的应该是:"acai"<"acorde"<"açaí"。 - nicolas.leblanc

5
你引用了一个代码页,它将码位映射到字符。码位是有限的非负整数集,并且具有良序和不同的实体。然而,这并不是字符的全部含义。
字符具有排序顺序,这是一种部分排序:字符可以“相等”但不相同。排序是一个用户值概念,根据语言环境(和时间)变化。
字符串更加复杂,因为某些字符集(如Unicode)可以包含组合字符。这使得“字符”可以表示为单个字符或基础字符后跟组合字符。例如,“ä”与“a¨”。由于它们代表相同的概念字符,因此应该比“ä”与“a”更相等。
在西班牙语中,“ch”,“rr”和“ll”曾经是字母表中的字母,单词的顺序也相应调整;现在,它们已经不再是字母,但“ñ”仍然是。
同样,在过去,英语人士对以“Mc”和“Mac”开头的姓氏进行排序,这些姓氏排在以“M”开头的其他姓氏之后,这种情况也很常见。

软件库必须处理这些问题,因为这正是用户所需要的。值得庆幸的是,一些旧的惯例已经不再使用。


因此,如果“c”与“ç”的排序顺序相同但“i”在“í”之前,则语言环境很可能具有排序规则,导致“acai”<“açaí”<“acorde”。尽管这种情况似乎很奇怪,但一般情况下,我们的代码需要允许这种可能性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接