【问题标题】:Replace Accented Characters in string to standard with LUA用 LUA 将字符串中的重音字符替换为标准
【发布时间】:2020-07-25 13:02:34
【问题描述】:

**这个错误看起来像是 UNITY 中的一个错误。该代码在桌面模拟器(我正在修改的游戏)之外似乎可以正常工作

我将其标记为已解决,但如果需要,将其留给模组删除,因为该代码可能仍然对其他人谷歌搜索有用。 **

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

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)

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

【问题讨论】:

  • 当我在 Lua 5.3 中按原样复制+粘贴您的代码时,我无法重现该问题(我得到了普通的us)。编码中的某些内容可能在 Stackoverflow 中丢失。你能把test解释为一个字节序列吗?例如,使用print(test:byte(1, #test))

标签: lua tabletop-simulator


【解决方案1】:

我不知道为什么该函数可以在 "à, á, â, ã, ä" 上运行,但在 "ù, ú, û, ü" 上使用时会删除字符。该函数假定两个字符串都以 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")或用于编码重音字母的两个两个字节("ù""\195\185")。 for 循环在tableAccents 表中查找每个字符,其中键是重音字母,值是相应的非重音字母(tableAccents["ù"]"u")。如果字符是表中的键,则该键的值将添加到normalizedString。如果字符不是表中的键,则添加而不更改。因此,重音字母被替换为非重音字母,而其他字符则保持不变。

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

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

【讨论】:

    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-08
      • 2011-05-16
      • 1970-01-01
      • 2013-11-15
      • 2012-05-19
      • 2012-01-26
      • 2019-04-23
      相关资源
      最近更新 更多