MSYS2报错:命令行含当前代码页不支持字符,Github Actions传Unicode失效求助
MSYS2参数转码逻辑变更:MSYS2更新后可能调整了Windows命令行参数转POSIX环境的规则,比如对部分Unicode字符的转码方式改动,或是新增了更严格的编码校验。可以试试设置环境变量
MSYS2_ARG_CONV_EXCL="*"禁用参数转换,让MSYS2直接将参数传递给可执行文件,看能否解决问题。可执行文件的编码适配问题:虽然Shell本身是UTF-8编码,但你的测试可执行文件可能依赖旧版MSYS2的转码行为。比如旧版会自动将Windows命令行参数转为UTF-8传递,新版可能切换了编码格式,或是程序本身期望接收GBK这类编码。可以在启动程序前临时设置
LC_ALL=C或LC_CTYPE=GBK测试,看能否正常接收字符。Github Actions环境的隐性变化:除了MSYS2更新,Windows runner环境可能也有改动,比如默认代码页、系统区域设置。虽然你测试了chcp为65001,但不同会话的系统编码设置可能存在差异,或是runner的默认环境变量被修改。可以在CI脚本里显式执行
chcp 65001和set LANG=en_US.UTF-8,再启动MSYS2,确保环境统一。特定Unicode字符的转码bug:部分Unicode字符(比如补充平面字符、带组合标记的字符)在新版MSYS2的转码逻辑里可能存在问题。可以测试不同类型的Unicode字符,比如常用Emoji、中文、特殊符号,定位是所有Unicode都失败还是仅特定字符。如果是特定字符,大概率是MSYS2更新后转码表遗漏或出错。
MSYS2启动方式的参数解析问题:你用
msys2 {0}启动程序,新版MSYS2对这种参数展开的处理方式可能改变了。试试直接在MSYS2 Shell里执行命令,或是用msys2 -c "你的带Unicode的命令"的方式,将命令字符串直接作为-c的参数传入,避免外层参数解析出问题。
内容的提问来源于stack exchange,提问作者Nickolay Olshevsky

