如何解决Lua中io.read()无法读取乌克兰语非英文字符的问题
修复Lua在Windows下无法读取西里尔字符(乌克兰语)的问题
问题原因
你已经用chcp 65001把控制台输出改成了UTF-8,但Windows控制台的输入在原生Lua的io.read()里没法正确识别UTF-8编码的西里尔字符;另外如果脚本文件本身编码不对,命令定义里的乌克兰语字符会提前乱码,导致匹配失败。
解决方法
1. 先确保脚本文件编码正确
把主程序和commandsfortest.lua都存成UTF-8编码:
- Lua 5.3及以上版本:存成UTF-8无BOM格式即可;
- Lua 5.2及以下版本:存成UTF-8带BOM格式,否则Lua无法正确解析文件中的西里尔字符。
2. 换一种方式读取输入
原生io.read()在Windows下对UTF-8输入支持有限,改用cmd的延迟扩展特性读取输入,保证字符编码正确:
-- 替换原来的local start = io.read() local function read_utf8_input() local handle = io.popen('cmd /v:on /c "set /p input= && echo !input!"', "r") local input = handle:read("*l") handle:close() return input end local start = read_utf8_input()
3. 优化命令匹配,避免空格坑
用户输入可能多打或少打空格,添加修剪函数统一处理输入和命令项:
-- 添加修剪字符串前后空格的函数 local function trim(s) return s:match'^%s*(.*%S)' or '' end -- 读取输入后先修剪 local start = trim(read_utf8_input()) -- 匹配命令时也修剪命令项 for group, commands in pairs(Command) do for _, cmd in ipairs(commands) do if start == trim(cmd) then -- 原有逻辑保持不变 end end end
4. 可选:隐藏编码切换提示
把os.execute("chcp 65001")改成os.execute("chcp 65001 >nul"),避免控制台弹出“活动代码页: 65001”的冗余提示。
替代方案
如果上述方法仍无法解决问题,可以尝试:
- 使用第三方Lua库:比如
luawin32直接调用Windows API读取控制台输入,完美支持UTF-8编码; - 切换到WSL环境运行Lua:WSL的控制台原生支持UTF-8,无需额外配置即可正常读取西里尔字符。
内容的提问来源于stack exchange,提问作者freziyt223
相关产品推荐
相关产品推荐

