写ref="/tag/2028/" style="color:#3D6345;font-weight:bold;">Ruby脚本时,很多人遇到过运行时报错“invalid multibyte char (UTF-8)”或者中文输出变成乱码的情况。这通常不是代码写错了,而是编码格式没设置对。尤其在Windows系统下,默认文本编辑器保存的文件可能是GBK编码,而Ruby默认期望的是UTF-8,这时候就容易出问题。
确认你的脚本文件编码
在动手改代码前,先看看你写的.rb文件是什么编码。用记事本打开Ruby脚本,点“另存为”,看底部的编码选项。如果是ANSI,那大概率是GBK或本地编码;选UTF-8才能让Ruby顺利读取中文字符。
在代码中声明编码格式
Ruby提供了在源码中指定编码的方式。只要在脚本第一行加上魔法注释,就能告诉解释器这个文件用的是什么编码。比如你的文件是UTF-8:
# -*- coding: utf-8 -*-
puts "你好,Ruby"
如果文件是GBK编码(常见于某些Windows环境),可以写成:
# -*- coding: gbk -*-
puts "你好,世界"
注意:这行必须是文件的第一行,否则无效。而且一旦声明了GBK,脚本里就不能混用其他编码的字符,不然还是会报错。
推荐统一使用UTF-8
虽然可以声明GBK,但更建议把编辑器默认保存格式设为UTF-8。像VS Code、Sublime Text、Notepad++都支持在保存时选择编码。设成UTF-8后,再配合第一行的coding声明,基本能杜绝乱码问题。
比如你在Notepad++里写完脚本,点“编码”→“转为UTF-8无BOM格式编码”→保存,再在第一行加上UTF-8声明,运行起来就顺畅多了。
终端输出也要匹配编码
有时候脚本编码对了,但命令行窗口不支持显示UTF-8,中文照样是乱码。在Windows上,CMD默认代码页是GBK,可以先输入命令切换:
chcp 65001
这条命令把控制台切换到UTF-8模式,然后再运行你的Ruby脚本,中文就能正常显示了。不过字体也得支持中文,不然会看到方框。
自动化处理小技巧
如果你经常在不同机器上跑脚本,可以在代码开头加个兼容性判断:
if RUBY_VERSION <= "1.9"
$KCODE = 'u'
end
# -*- coding: utf-8 -*-
puts "脚本已启用UTF-8支持"
虽然现代Ruby版本已经默认支持UTF-8,但在老环境跑脚本时,这种小补丁能省去不少麻烦。
编码问题看起来琐碎,但只要从文件保存、代码声明、终端显示三个环节都统一了,Ruby脚本里的中文处理就没那么头疼了。尤其是装机后第一次配置开发环境时,提前把这些细节设好,后面写脚本顺心不少。