Windows系统下Ruby调用gets无法识别CJK字符及打印异常问题咨询
问题根因
- Windows原生控制台的编码逻辑与Ruby默认外部编码配置不匹配,你设置的
Encoding.default_external = UTF-8仅覆盖了Ruby层的默认输出编码,未适配控制台的输入编码映射规则。 - Windows 10默认预装的PowerShell 5.x编码处理存在兼容性缺陷,
$PSDefaultParameterValues仅作用于PowerShell自身的cmdlet,对Ruby这类第三方可执行程序的标准输入输出完全不生效。 - Ruby的
gets方法输入编码默认继承控制台当前代码页,你之前仅配置了输出侧的UTF-8规则,未强制指定输入编码的转换逻辑。
可行解决方案
通用适配方案(cmd、PowerShell均生效)
- 运行Ruby脚本时强制指定输入输出编码,执行命令如下:
ruby -E UTF-8:UTF-8 你的脚本名称.rb - 如需全局生效,可在系统环境变量中新增
RUBYOPT变量,值设置为-EUTF-8:UTF-8,配置完成后所有Ruby进程启动时会自动强制输入输出编码为UTF-8,无需额外加参数。 - 可在脚本开头显式指定标准输入输出的编码,添加以下两行代码即可:
$stdin.set_encoding(Encoding::UTF_8) $stdout.set_encoding(Encoding::UTF_8)
PowerShell专属修复方案
- 优先升级到PowerShell 7+版本,新版本默认采用UTF-8作为全局编码,对第三方程序的IO编码兼容性大幅提升,无需额外配置即可正常处理CJK字符。
- 如暂不升级,每次打开PowerShell后先执行以下命令再运行Ruby脚本:
chcp 65001 $OutputEncoding = [System.Console]::OutputEncoding = [System.Console]::InputEncoding = [System.Text.Encoding]::UTF8
额外全局优化方案
- 可进入「控制面板-区域-管理-更改系统区域设置」,勾选「Beta版:使用Unicode UTF-8提供全球语言支持」,重启系统后生效,可彻底解决Windows全场景下的多语言编码兼容问题。
- 测试时不要使用Vim的
:!命令在内嵌终端直接运行Ruby脚本,Windows下Vim内嵌终端编码适配存在已知问题,建议单独打开控制台窗口运行测试。
内容的提问来源于stack exchange,提问作者Yasushiki
相关产品推荐
相关产品推荐

