智享技巧屋
第二套高阶模板 · 更大气的阅读体验

Ruby脚本中文乱码解决的实用方法

发布时间:2025-12-14 05:00:31 阅读:402 次

ref="/tag/2028/" style="color:#B2A89E;font-weight:bold;">Ruby脚本中文乱码常见场景

在处理日志分析、文件读取或网页爬虫任务时,不少人在运行Ruby脚本时遇到中文显示为“中”或“”这类乱码。尤其在Windows系统上更为常见,比如读取一个包含中文的配置文件,输出结果却全是看不懂的符号,让人头疼。

这个问题的核心通常出在字符编码不一致。Ruby默认使用ASCII或UTF-8处理字符串,但源文件或输入流可能是GBK或其他编码,导致解析出错。

确认文件编码格式

第一步是搞清楚你的文本文件到底是什么编码。可以用记事本另存为时查看选项,或者用命令行工具file检测:

file -i your_file.txt

如果返回charset=gb2312或charset=gbk,那就要在Ruby中显式声明读取方式。

读取文件时指定编码

打开文件时加上外部编码参数就能避免乱码:

File.open('data.txt', 'r:gbk:utf-8') do |file|
puts file.read
end

这里r:gbk:utf-8表示以GBK读入,自动转成UTF-8内部处理。如果你的系统环境是UTF-8,这招特别管用。

设置脚本源文件编码

有时候脚本本身包含中文注释或字符串,运行时报错。可以在文件头部加一行魔法注释:

# -*- coding: utf-8 -*-

puts "你好,世界"

这样Ruby解释器就知道按UTF-8解析脚本内容,不会把中文当乱码报错。

处理网络请求中的中文

用Net::HTTP抓网页时,响应体可能没带正确的Content-Type编码信息。这时候不能盲目转码,先检查header:

response = Net::HTTP.get_response(URI('http://example.com'))
body = response.body

if response['content-type'].include?('gbk')
body.force_encoding('gbk').encode('utf-8')
else
body.force_encoding('utf-8')
end
puts body

手动强制编码再转换,能有效防止页面中文错乱。

统一环境编码设置

在Windows上跑Ruby,控制台默认是GBK(CP936),而Linux和macOS多是UTF-8。可以设置环境变量让Ruby全局使用UTF-8:

export RUBYOPT=-Eutf-8

或者在启动脚本时加上ruby -E utf-8 script.rb,确保全程编码一致。

实际项目中,曾有个同事写了个自动化报告生成脚本,本地测试正常,部署到服务器后中文全变问号。排查发现是服务器locale设成了C而非zh_CN.UTF-8,改完语言环境立马恢复正常。