Ruby中gets方法无法读取日文控制台输入的问题排查
解决Ruby在Win10 PowerShell中读取日文输入乱码的问题
这个问题本质是控制台编码和Ruby输入编码不匹配导致的:
Win10的PowerShell默认编码现在大多是UTF-8,但Ruby在Windows环境下,默认会用系统的ANSI编码(日文系统对应CP932,也就是Shift-JIS)来解析控制台输入。当你输入UTF-8编码的日文时,Ruby把它当成CP932来读,自然就出现乱码了——而直接print "おはよう"正常,是因为脚本里的字符串编码已经被Ruby正确识别,输出时匹配了控制台的编码。
给你两个可行的解决办法:
办法1:修改Ruby代码,指定输入编码为UTF-8
直接在代码里设置默认外部编码,让Ruby用UTF-8读取输入,匹配PowerShell的编码:
# 让Ruby以UTF-8编码读取控制台输入 Encoding.default_external = Encoding::UTF_8 print "1> " line1 = gets.chomp print "2> " line2 = gets.chomp print "3> " line3 = gets.chomp puts line1 + line2 + line3
或者也可以在每次调用gets时单独指定编码:
print "1> " line1 = gets(encoding: Encoding::UTF_8).chomp # 后续的line2、line3同理处理
办法2:调整PowerShell的编码为CP932
如果不想修改代码,可以在运行Ruby脚本前,先在PowerShell里执行以下命令切换编码:
chcp 932
这个命令会把控制台的输入输出编码切换为日文Shift-JIS(CP932),和Ruby默认的输入编码匹配,输入的日文就能被正确解析了。
额外验证小技巧
你可以先在PowerShell里执行这两个命令,查看当前控制台的编码:
[Console]::InputEncoding [Console]::OutputEncoding
如果显示的是UTF-8,那就能确认是编码不匹配导致的乱码问题啦。
内容的提问来源于stack exchange,提问作者user9616828
相关产品推荐
相关产品推荐

