You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:43:17