按字母顺序对包含UTF-8编码值的表进行排序。

我将字典条目存储在 Lua 表中,使用它作为数组。我想从 Lua 对条目进行排序,以便我可以添加新条目而无需自己移动到正确位置(很快就会变得非常繁琐)。但是,我面临几个问题:

  1. 许多单词包含非 ASCII 字符,这使得字符串的内置比较运算符不适合此任务(例如,它使_amputar_在_ámbito_之前出现)。
  2. 有来自各种语言(尽管都是西方语言)的单词,即西班牙语、德语和英语。这里的问题是,不同的语言可能有不同的字母顺序概念。由于主要语言是西班牙语,我想使用它的规则,但我不确定它是否适用于不包含在西班牙语字母表中的字符。
  3. 一些单词包含大写字母,甚至更糟的是以它们开头。例如,所有德语名词都以大写字母开头。由于内置的比较运算符,大写字母会出现在它们的小写同胞之前,这不是我想要的行为;我希望大写字母与它们的小写同胞完全相同。

例如,考虑以下表:

local entries =
{
    'amputar',
    'Volksgeist',
    'ámbito'
}

这些条目应该按如下顺序排序:

ámbito

amputar

Volksgeist

但是,使用我的当前代码,输出是错误的:

local function compare_utf8_strings( o1 , o2 )
    -- 使用内置的非 UTF-8 意识,非区域感知的字符串比较运算符
    return o1 < o2
end

table.sort( entries , function ( a , b ) return compare_utf8_strings( a , b ) end )

for i, entry in ipairs(entries) do
    print( entry )
end

输出为:

Volksgeist

amputar

ámbito

请使用以下代码并进行修改以满足我的要求:

local entries =
{
    'amputar',
    'Volksgeist',
    'ámbito'
}

local function compare_utf8_strings( o1 , o2 )
    -- 在这里修改以满足我的要求
end

table.sort( entries , function ( a , b ) return compare_utf8_strings( a , b ) end )

for i, entry in ipairs(entries) do
    print( entry )
end

它应该输出:

ámbito

amputar

Volksgeist

作为额外的要求,此 Lua 代码全部位于 LuaTeX 中,该软件当前支持语言的 5.2 版本。至于外部库,我想可能可以使用它们。我是 Lua 阵营的新手,所以请原谅我可能犯的任何错误,并随时通知,以便我进行修正。

点赞