将字符串中的重音字符替换为LUA标准

时间:2018-05-22 02:53:13

标签: lua

**这个错误看起来像是一个整体的BUG。该代码看起来在平板电脑模拟器外面工作(我正在修改的游戏)

我将此标记为已解决,但如果需要则将其留给mod删除,因为代码可能仍然对其他人用Google进行搜索。 **

我正在尝试处理几行的大字符串..并希望将所有重音字符转换为标准字符。我有一些我在网上得到的代码,但是代码中有一个小错误,我不明白它是如何工作的,所以如果你能的话,需要一些关于这个问题的帮助。

function stripChars(str)
    local tableAccents = {}
        tableAccents["à"] = "a"
        tableAccents["á"] = "a"
        tableAccents["â"] = "a"
        tableAccents["ã"] = "a"
        tableAccents["ä"] = "a"
        tableAccents["ç"] = "c"
        tableAccents["è"] = "e"
        tableAccents["é"] = "e"
        tableAccents["ê"] = "e"
        tableAccents["ë"] = "e"
        tableAccents["ì"] = "i"
        tableAccents["í"] = "i"
        tableAccents["î"] = "i"
        tableAccents["ï"] = "i"
        tableAccents["ñ"] = "n"
        tableAccents["ò"] = "o"
        tableAccents["ó"] = "o"
        tableAccents["ô"] = "o"
        tableAccents["õ"] = "o"
        tableAccents["ö"] = "o"
        tableAccents["ù"] = "u"
        tableAccents["ú"] = "u"
        tableAccents["û"] = "u"
        tableAccents["ü"] = "u"
        tableAccents["ý"] = "y"
        tableAccents["ÿ"] = "y"
        tableAccents["À"] = "A"
        tableAccents["Á"] = "A"
        tableAccents["Â"] = "A"
        tableAccents["Ã"] = "A"
        tableAccents["Ä"] = "A"
        tableAccents["Ç"] = "C"
        tableAccents["È"] = "E"
        tableAccents["É"] = "E"
        tableAccents["Ê"] = "E"
        tableAccents["Ë"] = "E"
        tableAccents["Ì"] = "I"
        tableAccents["Í"] = "I"
        tableAccents["Î"] = "I"
        tableAccents["Ï"] = "I"
        tableAccents["Ñ"] = "N"
        tableAccents["Ò"] = "O"
        tableAccents["Ó"] = "O"
        tableAccents["Ô"] = "O"
        tableAccents["Õ"] = "O"
        tableAccents["Ö"] = "O"
        tableAccents["Ù"] = "U"
        tableAccents["Ú"] = "U"
        tableAccents["Û"] = "U"
        tableAccents["Ü"] = "U"
        tableAccents["Ý"] = "Y"
    local normalizedString = ''

    for strChar in string.gmatch(str, "([%z\1-\127\194-\244][\128-\191]*)") do
        if tableAccents[strChar] ~= nil then
            normalizedString = normalizedString..tableAccents[strChar]
        else
            normalizedString = normalizedString..strChar
        end
    end
 return normalizedString
end

这段代码似乎运行得很好,但它对u类型字符不起作用......所以......

local test = "ù, ú, û, ü"
print(stripChars(test)) -- Prints (,,,)
test = "à, á, â, ã, ä"
print(stripChars(test)) -- Prints (a, a, a, a, a)

任何想法?我认为它与模式的东西有关...但我不知道它在第一位是如何工作的。 (参见大字符表下代码块的底部)

2 个答案:

答案 0 :(得分:2)

我不知道为什么该函数可以在"à, á, â, ã, ä"上运行,但会在"ù, ú, û, ü"上使用时删除字符。该函数假定两个字符串都以UTF-8编码。也许这是一个编码问题,但我希望它在两种情况下都会失败。对我来说,按"ù, ú, û, ü"调用该函数会给出"u, u, u, u",如预期的那样。

正如Curtis F所说,可能有助于在字符串上调用print(string.byte(test, 1, -1)),而无法找出它是如何被编码的。我有以UTF-8编码的文件,因此打印的值为195 185 44 32 195 186 44 32 195 187 44 32 195 188

该函数的工作原理是"[%z\1-\127\194-\244][\128-\191]*"是一种匹配UTF-8 encoding中编码的单个字符(代码点)的模式。每个代码点需要1到4个字节。例如,模式匹配用于编码逗号字符的单个字节(",""\44"),或者用于编码重音字母的两个两个字节("ù"是{ {1}})。 for循环查找"\195\185"表中的每个字符,其中键是重音字母,值是相应的非重音字符(tableAccentstableAccents["ù"])。如果字符是表中的键,则该键的值将添加到"u"。如果字符不是表中的键,则添加它而不进行更改。因此,重音字母被替换为非重音字母,而其他字符则单独存在。

这只是一个代码清理建议:使用normalizedString可以简化for循环:

string.gsub

答案 1 :(得分:0)

以防万一有人需要更完整的列表,我想我应该在这里添加它。感谢您的帮助!

function stripChars(str)
  local tableAccents = {}
    tableAccents["À"] = "A"
    tableAccents["Á"] = "A"
    tableAccents["Â"] = "A"
    tableAccents["Ã"] = "A"
    tableAccents["Ä"] = "A"
    tableAccents["Å"] = "A"
    tableAccents["Æ"] = "AE"
    tableAccents["Ç"] = "C"
    tableAccents["È"] = "E"
    tableAccents["É"] = "E"
    tableAccents["Ê"] = "E"
    tableAccents["Ë"] = "E"
    tableAccents["Ì"] = "I"
    tableAccents["Í"] = "I"
    tableAccents["Î"] = "I"
    tableAccents["Ï"] = "I"
    tableAccents["Ð"] = "D"
    tableAccents["Ñ"] = "N"
    tableAccents["Ò"] = "O"
    tableAccents["Ó"] = "O"
    tableAccents["Ô"] = "O"
    tableAccents["Õ"] = "O"
    tableAccents["Ö"] = "O"
    tableAccents["Ø"] = "O"
    tableAccents["Ù"] = "U"
    tableAccents["Ú"] = "U"
    tableAccents["Û"] = "U"
    tableAccents["Ü"] = "U"
    tableAccents["Ý"] = "Y"
    tableAccents["Þ"] = "P"
    tableAccents["ß"] = "s"
    tableAccents["à"] = "a"
    tableAccents["á"] = "a"
    tableAccents["â"] = "a"
    tableAccents["ã"] = "a"
    tableAccents["ä"] = "a"
    tableAccents["å"] = "a"
    tableAccents["æ"] = "ae"
    tableAccents["ç"] = "c"
    tableAccents["è"] = "e"
    tableAccents["é"] = "e"
    tableAccents["ê"] = "e"
    tableAccents["ë"] = "e"
    tableAccents["ì"] = "i"
    tableAccents["í"] = "i"
    tableAccents["î"] = "i"
    tableAccents["ï"] = "i"
    tableAccents["ð"] = "eth"
    tableAccents["ñ"] = "n"
    tableAccents["ò"] = "o"
    tableAccents["ó"] = "o"
    tableAccents["ô"] = "o"
    tableAccents["õ"] = "o"
    tableAccents["ö"] = "o"
    tableAccents["ø"] = "o"
    tableAccents["ù"] = "u"
    tableAccents["ú"] = "u"
    tableAccents["û"] = "u"
    tableAccents["ü"] = "u"
    tableAccents["ý"] = "y"
    tableAccents["þ"] = "p"
    tableAccents["ÿ"] = "y"

  local normalisedString = ''

  local normalisedString = str: gsub("[%z\1-\127\194-\244][\128-\191]*", tableAccents)

  return normalisedString

end