【问题标题】:String ordering in LuaLua中的字符串排序
【发布时间】:2014-04-29 20:44:23
【问题描述】:

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

例如,对于欧洲 Latin-1 语言环境,我们有 "acai"

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

AFAIK (and wikipedia seems to confirm)、"c" < "ç",还是我错了?

【问题讨论】:

  • 我猜这是书中的错误。字符串排序是一个字母一个字母的排序,所以"acai" < "açaí" < "acorde"等价于'c' < 'ç' < 'c',这是无意义的。
  • 我读这部分的时候也有同样的想法,我有第三版。
  • 哪个“欧洲拉丁语 1 语言环境”?有很多...

标签: string character-encoding lua


【解决方案1】:

在 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í"的顺序好像和现在的书不一样了。

【讨论】:

  • 好的。这是事实,但它并不能解释这种行为。我的意思是,为什么是"acai" &lt; "açaí""açaí" &lt; "acorde"?正如@Kamiccolo 在评论中指出的那样,lvm.c 使用 strcoll() 函数来比较字符串,因此看起来变音符号在比较中可能不相关。
  • @yu @stu "açaí" &lt; "acorde" 不正确(由@YuHao 突出显示)。确实,我也相信书中有一个错字。应该写成:"acai"&lt;"acorde"&lt;"açaí"
【解决方案2】:

您引用了一个代码页,它将代码点映射到字符。当然,码点是一组有限的非负整数,是有序的、不同的实体。然而,这不是角色的意义所在。

字符有一个collation 顺序,这是一个偏序:字符可以“相等”但不相同。排序规则是一个用户重视的概念,因地区(和时间)而异。

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

在西班牙语中,“ch”、“rr”和“ll”曾经是字母表中的字母,单词按顺序排列;现在,它们不是,但“ñ”仍然是。

同样,在过去,说英语的人将“Mc”和“Mac”开头的姓氏排在其他以“M”开头的姓氏之后并不少见。

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


因此,如果“c”与“ç”具有相同的排序顺序但“i”在“í”之前,则语言环境很可能具有导致“acai”

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 2020-10-17
    • 2019-03-08
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多