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



**此错误看起来像是 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, "([%z1-127194-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)

有什么想法吗?..我认为这与模式有关。但我不明白它首先是如何工作的。(请参阅大字符表下的代码块底部(

我不知道为什么该函数适用于"à, á, â, ã, ä"但在"ù, ú, û, ü"上使用时会删除字符。该函数假定两个字符串都以 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.

该函数的工作原理是"[%z1-127194-244][128-191]*"是匹配以 UTF-8 编码编码的单个字符(代码点(的模式。每个代码点占用 1 到 4 个字节。例如,该模式匹配用于编码逗号字符的单个字节(",""44"(或用于编码重音字母的两个字节("ù""195185"(。for 循环查找tableAccents表中的每个字符,其中键是重音字母,值是相应的非重音字母 (tableAccents["ù"]"u"(。如果字符是表中的键,则该键的值将添加到normalizedString中。如果该字符不是表中的键,则添加该字符而不进行更改。因此,重音字母被替换为无重音字母,而其他字符则单独保留。

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

local normalizedString = str:gsub("[%z1-127194-244][128-191]*", 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("[%z1-127194-244][128-191]*", tableAccents)
return normalisedString
end

我只是想提交一个修改后的函数,该函数使用字符串映射(而不是数组(来简化字符输入。

function normalizeLatin (str,ind)
local unimask = "[%z1-127194-244][128-191]*"
return str:gsub(unimask, function(unichar) 
local charmap = --"Basic Latin".."Latin-1 Supplement".."Latin Extended-A".."Latin Extended-B"..
"A".."ÀÁÂÃÄÅ".."ĀĂĄ".."ǍǞǠǺȀȂȦȺ"..
"AE".."Æ".."".."ǢǼ"..
"B".."ß".."".."ƁƂƄɃ"..
"C".."Ç".."ĆĈĊČ".."ƆƇȻ"..
"D".."Ð".."ĎĐ".."ƉƊ"..
"DZ".."".."".."ƻDŽDZ"..
"Dz".."".."".."DžDz"..
"E".."ÈÉÊË".."ĒĔĖĘĚ".."ƎƏƐȄȆȨɆ"..
"F".."".."".."Ƒ"..
"G".."".."ĜĞĠĢ".."ƓǤǦǴ"..
"H".."".."ĤĦ".."Ȟ"..
"Hu".."".."".."Ƕ"..
"I".."ÌÍÎÏ".."ĨĪĬĮİ".."ƖƗǏȈȊ"..
"IJ".."".."IJ"..""..
"J".."".."Ĵ".."Ɉ"..
"K".."".."Ķ".."ƘǨ"..
"L".."".."ĹĻĽĿŁ".."Ƚ"..
"LJ".."".."".."LJ"..
"Lj".."".."".."Lj"..
"N".."Ñ".."ŃŅŇŊ".."ƝǸȠ"..
"NJ".."".."".."NJ"..
"Nj".."".."".."Nj"..
"O".."ÒÓÔÕÖØ".."ŌŎŐ".."ƟƠǑǪǬǾȌȎȪȬȮȰ"..
"OE".."".."Œ"..
"OI".."".."".."Ƣ"..
"OU".."".."".."Ȣ"..
"P".."Þ".."".."ƤǷ"..
"Q".."".."".."Ɋ"..
"R".."".."ŔŖŘ".."ȐȒɌ"..
"S".."".."ŚŜŞŠ".."ƧƩƪƼȘ"..
"T".."".."ŢŤŦ".."ƬƮȚȾ"..
"U".."ÙÚÛÜ".."ŨŪŬŮŰŲ".."ƯƱƲȔȖɄǓǕǗǙǛ"..
"V".."".."".."Ʌ"..
"W".."".."Ŵ".."Ɯ"..
"Y".."Ý".."ŶŸ".."ƳȜȲɎ"..
"Z".."".."ŹŻŽ".."ƵƷƸǮȤ"..
"a".."àáâãäå".."āăą".."ǎǟǡǻȁȃȧ"..
"ae".."æ".."".."ǣǽ"..
"b".."".."".."ƀƃƅ"..
"c".."ç".."ćĉċč".."ƈȼ"..
"d".."ð".."".."ƌƋƍȡďđ"..
"db".."".."".."ȸ"..
"dz".."".."".."dždz"..    
"e".."èéêë".."ēĕėęě".."ǝȅȇȩɇ"..
"f".."".."".."ƒ"..
"g".."".."ĝğġģ".."Ɣǥǧǵ"..
"h".."".."ĥħ".."ȟ"..
"hv".."".."".."ƕ"..
"i".."ìíîï".."ĩīĭįı".."ǐȉȋ"..
"ij".."".."ij"..""..
"j".."".."ĵ".."ǰȷɉ"..
"k".."".."ķĸ".."ƙǩ"..
"l".."".."ĺļľŀł".."ƚƛȴ"..
"lj".."".."".."lj"..
"n".."ñ".."ńņňʼnŋ".."ƞǹȵ"..
"nj".."".."".."nj"..
"o".."òóôõöø".."ōŏő".."ơǒǫǭǿȍȏȫȭȯȱ"..
"oe".."".."œ"..""..
"oi".."".."".."ƣ"..
"ou".."".."".."ȣ"..
"p".."þ".."".."ƥƿ"..
"q".."".."".."ɋ"..
"qp".."".."".."ȹ"..
"r".."".."ŕŗř".."Ʀȑȓɍ"..
"s".."".."śŝşšſ".."ƨƽșȿ"..
"t".."".."ţťŧ".."ƫƭțȶ"..
"ts".."".."".."ƾ"..
"u".."ùúûü".."ũūŭůűų".."ưǔǖǘǚǜȕȗ"..
"w".."".."ŵ"..""..
"y".."ýÿ".."ŷ".."ƴȝȳɏ"..
"z".."".."źżž".."ƶƹƺǯȥɀ"..
""
unichar = unichar:gsub('[%(%)%.%%%+%-%*%?%[%^%$]','%%%0') --escape magic characters
return unichar:match("%a") or charmap:match("(%a+)[^%a]-"..unichar)
end, ind)
end

它涵盖了Unicode块Latin-1 Supplement,LatinExtended-A和Latin Extended-B(U + 00C0–U + 024F,"×÷ǀǁǂǃɁɂ"除外(中的字母,但可以很容易地扩展到更多块。

通常,映射使用本文作为参考将每个字符转换为其非重音、非镜像、未组合和未样式化的形式,Yogh 的特殊情况映射到"y"而不是"z",

yogh (ȝogh( (Ȝ ȝ;苏格兰人:约赫;中古英语:ȝogh(用于中古英语和古苏格兰语,代表y(/j/(和各种软腭音素。

和 Hwair (ƕ( 映射到"hv"而不是"hu"。

哥特字母被音译为同名拉丁连字ƕ,这是语言学家在1900年左右引入的,以取代二合字母hv

以下是一些示例输入/输出:

input: "ƮĤË ɊǕĨȻǨ ɃȐØŴǸ ƑÕX ĴŲMǷŞ ƠɅƐȐ ƬĤȨ ĿǺƵȲ ÐƟĞ."
output: "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG."
input: "țĥé ɋŭíçĸ ƀŗôŵñ ƒøx ĵûmþś ôvǝȑ ȶħȩ ȴãƺɏ ƌȭğ."
output: "the quick brown fox jumps over the lazy dog."

希望这对某人有所帮助,在某个地方! 🦊

最新更新