用 LUA 替换字符串中的重音字符
2020-7-25 5:2:34
收藏:0
阅读:102
评论:2
**这个错误看起来像是 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)
有什么想法吗?我猜这可能与模式有关,但我不清楚它的第一种形式是如何工作的。(请参见大字符表下方的代码块)
点赞
用户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
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我不知道为什么这个函数在处理
"à , á, â, ã, ä"时有效,但在处理"ù, ú, û, ü"时会删除字符。该函数假定这两个字符串都是以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)