用 LUA 替换字符串中的重音字符

**这个错误看起来像是 Unity 的一个 BUG。这段代码在桌面模拟器(我正在进行调整的游戏)之外似乎正常工作。

我将其标记为已解决,但是如果需要的话,我会让版主将其删除,因为这段代码可能对其他人使用谷歌搜索还是有用的。 **

我试图处理几行文本的大字符串,想把所有发现的重音字符转换为标准字符。我从网上找到了一些代码,但是代码中有一个小 bug,而我却不理解它是如何工作的,所以如果您能够帮助解决这个问题,我将不胜感激。

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)) -- 输出 (,,,)
test = "à, á, â, ã, ä"
print(stripChars(test)) -- 输出 (a, a, a, a, a)

有什么想法吗?我猜这可能与模式有关,但我不清楚它的第一种形式是如何工作的。(请参见大字符表下方的代码块)

点赞
用户9383219
用户9383219

我不知道为什么这个函数在处理"à, á, â, ã, ä"时有效,但在处理"ù, ú, û, ü"时会删除字符。该函数假定这两个字符串都是以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编码编码的单个字符(码点)。每个码点需要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)
2018-05-22 04:11:59
用户11544408
用户11544408

以防有人需要更完整的列表,我打算将其添加到此处。感谢大家提供的帮助!

function stripChars(str)
  -- 定义转换表
  local tableAccents = {}
    tableAccents["À"] = "A"
    tableAccents["Á"] = "A"
    -- 省略中间部分
    tableAccents["ÿ"] = "y"

  -- 定义标准化字符串
  local normalisedString = ''

  -- 替换字符串中的非ASCII字符
  local normalisedString = str: gsub("[%z\1-\127\194-\244][\128-\191]*", tableAccents)

  -- 返回标准化字符串
  return normalisedString
end
2019-05-23 12:37:41