将字符串中的重音字符替换为标准 LUA
Replace Accented Characters in string to standard with LUA
**这个错误看起来像是 UNITY 中的错误。代码似乎在桌面模拟器之外也能正常工作(我正在修改的游戏)
我将其标记为已解决,但如果需要,请将其留给 mod 删除,因为该代码可能对其他人进行谷歌搜索仍然有用。
**
我正在尝试处理包含几行的大字符串.. 并希望将它找到的所有重音字符都转换为标准字符。我为此从网上获得了一些代码,但代码中有一个小错误,我不明白它是如何工作的,所以如果你能的话,在这个问题上需要一些帮助。
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-74-4][8-1]*)") 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)
有什么想法吗?..我认为这与模式有关..但我一开始并不知道它是如何工作的。 (请参阅大 table 字符下的代码块底部)
我不知道为什么该函数可以在 "à, á, â, ã, ä"
上运行,但在 "ù, ú, û, ü"
上使用时会删除字符。该函数假定两个字符串均以 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-74-4][8-1]*"
是一个匹配 UTF-8 encoding 中编码的单个字符(代码点)的模式。每个代码点占用 1 到 4 个字节。例如,该模式匹配用于编码逗号字符的单个字节(","
是 ""
)或用于编码重音字母的两个两个字节("ù"
是 "55"
). for 循环查找 tableAccents
table 中的每个字符,其中键是重音字母,值是相应的非重音字母(tableAccents["ù"]
→ "u"
)。如果该字符是 table 中的键,则该键的值将添加到 normalizedString
中。如果字符不是 table 中的键,则添加而不更改。因此重音字母被替换为无重音字母,而其他字符保持不变。
这只是一个代码清理建议:可以使用 string.gsub
:
简化 for 循环
local normalizedString = str:gsub("[%z-74-4][8-1]*", tableAccents)
以防万一有人需要更完整的列表,我想我应该把它添加到这里。感谢您对此的帮助!
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-74-4][8-1]*", tableAccents)
return normalisedString
end
**这个错误看起来像是 UNITY 中的错误。代码似乎在桌面模拟器之外也能正常工作(我正在修改的游戏)
我将其标记为已解决,但如果需要,请将其留给 mod 删除,因为该代码可能对其他人进行谷歌搜索仍然有用。 **
我正在尝试处理包含几行的大字符串.. 并希望将它找到的所有重音字符都转换为标准字符。我为此从网上获得了一些代码,但代码中有一个小错误,我不明白它是如何工作的,所以如果你能的话,在这个问题上需要一些帮助。
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-74-4][8-1]*)") 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)
有什么想法吗?..我认为这与模式有关..但我一开始并不知道它是如何工作的。 (请参阅大 table 字符下的代码块底部)
我不知道为什么该函数可以在 "à, á, â, ã, ä"
上运行,但在 "ù, ú, û, ü"
上使用时会删除字符。该函数假定两个字符串均以 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-74-4][8-1]*"
是一个匹配 UTF-8 encoding 中编码的单个字符(代码点)的模式。每个代码点占用 1 到 4 个字节。例如,该模式匹配用于编码逗号字符的单个字节(","
是 ""
)或用于编码重音字母的两个两个字节("ù"
是 "55"
). for 循环查找 tableAccents
table 中的每个字符,其中键是重音字母,值是相应的非重音字母(tableAccents["ù"]
→ "u"
)。如果该字符是 table 中的键,则该键的值将添加到 normalizedString
中。如果字符不是 table 中的键,则添加而不更改。因此重音字母被替换为无重音字母,而其他字符保持不变。
这只是一个代码清理建议:可以使用 string.gsub
:
local normalizedString = str:gsub("[%z-74-4][8-1]*", tableAccents)
以防万一有人需要更完整的列表,我想我应该把它添加到这里。感谢您对此的帮助!
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-74-4][8-1]*", tableAccents)
return normalisedString
end