知易通
第二套高阶模板 · 更大气的阅读体验

Ruby脚本中文乱码解决实战案例

发布时间:2025-12-14 05:00:11 阅读:415 次

最近在公司做一个数据导出的小工具,用 ref="/tag/2028/" style="color:#643D3D;font-weight:bold;">Ruby 写的脚本,结果一运行,中文全变成了问号和方块。一开始以为是编辑器的问题,换了几种编码保存方式也没用,最后才发现是 Ruby 脚本处理字符编码时默认没设置好。

问题重现

比如有这么一段代码:

puts "姓名:张三"
File.open("output.txt", "w") { |f| f.write "城市:北京" }

运行后终端显示乱码,生成的文件用记事本打开也是乱的。特别是在 Windows 系统上特别常见,因为系统默认是 GBK 编码,而 Ruby 脚本通常按 UTF-8 处理。

源头定位:编码不一致

Ruby 1.9 之后引入了字符编码机制,但脚本本身的源码编码、运行环境的编码、输入输出流的编码,这三者必须协调一致。只要其中一个环节掉链子,中文就容易出问题。

解决方案一:声明源码编码

在脚本最开头加上魔术注释,告诉 Ruby 这个文件是 UTF-8 编码:

# encoding: utf-8
puts "项目名称:数据分析报告"

这一步很关键,尤其是你用的是 UTF-8 编辑器保存的代码。如果不加,Ruby 可能按 ASCII 或系统默认去解析,中文自然就乱了。

解决方案二:统一输入输出编码

如果要往文件写中文,别直接 open 就写,得指定外部编码:

File.open("report.txt", "w:UTF-8") do |file|
  file.write "摘要:本月销售额稳步上升"
end

读取文件也一样,特别是读取从 Windows 下保存的 CSV 文件,可能是 GBK:

File.open("data.csv", "r:GBK") do |file|
  puts file.read.encode("UTF-8")
end

解决方案三:终端显示适配

在 Windows 上跑 Ruby 脚本,cmd 默认是 GBK,这时候即使你用 UTF-8 输出,也会乱码。可以临时转换输出流的编码:

if RUBY_PLATFORM =~ /win32/
  $stdout.set_encoding("GBK")
end
puts "状态:处理完成"

或者更彻底一点,让整个脚本都在 GBK 环境下运行,适合只在内部系统使用的情况。

实际项目中的处理习惯

我现在写 Ruby 脚本,不管有没有中文,都养成三个习惯:

  • 第一行永远写 # encoding: utf-8
  • 文件读写明确标注 :UTF-8 或 :GBK
  • 涉及终端输出时,判断平台做编码适配

比如一个导出用户列表的脚本:

# encoding: utf-8
users = [{name: "李四", city: "上海"}, {name: "王五", city: "深圳"}]

File.open("users.csv", "w:UTF-8") do |f|
  f.puts "姓名,城市"
  users.each { |u| f.puts "#{u[:name]},#{u[:city]}" }
end

这样无论在 macOS、Linux 还是 Windows 上跑,只要用支持 UTF-8 的编辑器打开 CSV,中文都能正常显示。

遇到乱码别慌,先搞清楚是源码、运行环境还是输出目标的编码不匹配,对症下药,问题很快就能解决。