写ref="/tag/2028/" style="color:#643D3D;font-weight:bold;">Ruby脚本时,很多人遇到过运行报错或输出乱码的问题,尤其是处理中文文件名、注释或字符串时。其实,这多半是因为编码格式没设置对。虽然Ruby 2.0以后默认使用UTF-8,但在不同系统或编辑器环境下,仍然容易出问题。
查看当前脚本的编码
在调试前,先确认你的脚本是以什么编码读取的。可以在代码中加入以下语句:
puts Encoding.default_external
puts Encoding.default_internal
这两行会输出外部和内部默认编码。如果显示不是UTF-8,就可能引发乱码。
在脚本顶部声明编码
最直接的办法是在Ruby脚本的第一行加上编码声明。比如,你用的是UTF-8编码,就这么写:
# -*- coding: utf-8 -*-
puts "你好,世界"
这样Ruby解释器就知道按UTF-8来解析文件内容。注意,这行必须放在文件开头,否则无效。
编辑器别“偷偷”改了编码
有时候代码写得好好的,一运行就出错,其实是编辑器“背锅”。比如你用的是记事本,默认保存为ANSI(其实就是GBK),而Ruby按UTF-8读,自然就乱了。建议使用VS Code、Sublime Text这类能明确设置保存编码的编辑器,并统一选UTF-8无BOM格式。
处理外部输入时也要指定编码
从文件读取数据时,别忘了指定编码。比如读一个包含中文的文本:
File.open('data.txt', 'r:UTF-8') do |file|
puts file.read
end
或者用readlines时也一样:
lines = File.readlines('notes.txt', encoding: 'UTF-8')
这样能确保读进来的内容不会变成一堆问号或乱码字符。
服务器环境别忽略
本地跑得好好的脚本,放到Linux服务器上突然出错,可能是系统LANG环境变量没设。可以检查一下:
echo $LANG
建议设置为 en_US.UTF-8 或 zh_CN.UTF-8。在启动脚本前加一句:
export LANG=en_US.UTF-8
能避免不少编码相关的坑。
编码问题看起来小,真碰上了挺烦人。花几分钟把格式设清楚,比事后查半天错误省心得多。