**这个错误看起来像是一个整体的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)
任何想法?我认为它与模式的东西有关...但我不知道它在第一位是如何工作的。 (参见大字符表下代码块的底部)
答案 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"
表中的每个字符,其中键是重音字母,值是相应的非重音字符(tableAccents
→tableAccents["ù"]
)。如果字符是表中的键,则该键的值将添加到"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