Lua中的字符串排序

时间:2014-04-14 12:18:38

标签: string character-encoding lua

我正在阅读Programming in Lua, 1st edition(是的,我知道它有点过时了),在section 3.2(关于关系运算符)中,作者说:

  

例如,使用欧洲Latin-1语言环境,我们有“acai”< “açaí”< “acorde”。

我不明白。对我来说,"acai" < "açaí"可以,但为什么"açaí" < "acorde"

AFAIK(and wikipedia seems to confirm),"c" < "ç",或者我错了?

2 个答案:

答案 0 :(得分: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 :(得分:5)

您引用代码页,将代码点映射到字符。当然,代码点是一组有限的非负整数,是有序的,不同的实体。但是,这不是人物的意思。

字符有collation个顺序,这是一个部分排序:字符可以“相等”但不相同。整理是一个用户价值的概念,因地区而异(随着时间的推移)。

字符串甚至更复杂,因为某些字符集(例如Unicode)可以具有组合字符。这允许“字符”表示为单个字符或基本字符,后跟组合字符。例如,“ä”vs“a¨”。由于它们代表相同的概念性特征,因此它们应被视为比“ä”与“a”更加平等。

在西班牙语中,“ch”,“rr”和“ll”曾经是字母表中的字母,并且相应地排序了单词;现在,他们不是,但“仍然”。

同样地,在过去,英语使用者以“Mc”开头的姓氏和以“M”开头的“Mac”之后的姓氏并不少见。

软件库必须处理这些事情,因为这是用户想要的。值得庆幸的是,一些较旧的惯例已经不再使用了。


因此,区域设置很可能具有导致“acai”&lt; “açaí”&lt; “acorde”如果“c”与“ç”具有相同的排序顺序,但“i”在“í”之前。虽然这种情况通常需要我们的代码允许它,但这种情况似乎很奇怪。