1. Ruby 中的编码基础
Ruby 支持多种字符编码,最常用的是 UTF-8,它是处理中文的默认推荐编码。Ruby 从 2.0 版本开始,默认源代码编码是 UTF-8,这意味着你可以直接在代码中使用中文。
检查 Ruby 的编码设置
运行以下代码查看默认编码:
puts Encoding.default_external # 外部编码(文件、输入输出)
puts Encoding.default_internal # 内部编码(程序处理时的编码)
通常,default_external
会根据系统环境设置(Windows 可能是 Windows-1252
,Linux/macOS 通常是 UTF-8
)。
2. 在代码中直接使用中文
Ruby 支持直接在代码中写中文,前提是文件保存为 UTF-8 编码:
puts "你好,世界!"
name = "张三"
puts "我的名字是 #{name}"
运行结果:
你好,世界!
我的名字是 张三
注意事项
- 文件编码:确保你的代码文件保存为 UTF-8。使用文本编辑器(如 VS Code)时,检查文件编码设置。
- Ruby 1.8 或更早版本(已过时):需要添加编码声明
# encoding: UTF-8
。现代版本(2.x、3.x)无需此行。
3. 处理中文输入和输出
终端显示中文
在 Windows 上,CMD 默认使用 GBK
或 Windows-1252
编码,可能导致中文乱码。解决方法:
- 切换终端编码:
在 CMD 中运行:
chcp 65001
这将终端编码改为 UTF-8。
- 使用 PowerShell 或其他终端:PowerShell 默认支持 UTF-8,通常效果更好。
示例:
puts "你好,欢迎使用 Ruby!"
运行前确保终端支持 UTF-8,否则可能显示乱码。
从用户输入读取中文
print "请输入你的名字:"
name = gets.chomp
puts "你好,#{name}!"
gets
获取用户输入,chomp
移除末尾换行符。- 如果输入中文乱码,检查
Encoding.default_external
是否为UTF-8
。
4. 文件中的中文编码
读取中文文件
假设有一个 UTF-8 编码的文件 text.txt
,内容是:
你好
这是 Ruby 测试
读取代码:
File.open("text.txt", "r:UTF-8") do |file|
file.each_line do |line|
puts line
end
end
"r:UTF-8"
指定文件以 UTF-8 编码读取。- 如果文件编码不是 UTF-8(例如 GBK),可以用
"r:GBK"
,然后转换:
content = File.read("text.txt", encoding: "GBK").encode("UTF-8")
puts content
写入中文到文件
File.open("output.txt", "w:UTF-8") do |file|
file.puts "你好,世界!"
file.puts "这是中文测试"
end
"w:UTF-8"
确保写入时使用 UTF-8 编码。
5. 编码转换
Ruby 提供了 encode
方法处理编码转换。例如,将 GBK 转换为 UTF-8:
text = "你好".encode("GBK") # 假设原始是 UTF-8,转为 GBK
puts text.encoding # => GBK
converted = text.encode("UTF-8")
puts converted # => 你好
检查字符串编码
str = "你好"
puts str.encoding # => UTF-8
处理乱码
如果遇到乱码:
- 确认源数据的编码(可以用
file
命令或编辑器检查)。 - 用
force_encoding
强制指定编码:
str = some_data.force_encoding("UTF-8")
- 如果仍无效,用
encode
转换并处理无效字符:
str.encode("UTF-8", invalid: :replace, undef: :replace, replace: "?")
6. Windows 下的额外注意
Windows 默认编码可能是 GBK
或 Windows-1252
,需要特别处理:
- 设置外部编码:
Encoding.default_external = "UTF-8"
puts "你好" # 确保输出正确
- 运行脚本前:在 CMD 中运行
chcp 65001
,或用 PowerShell。
7. 实践示例
示例 1:读取并处理中文
创建一个 test.txt
(UTF-8 编码),内容:
张三, 25
李四, 30
代码:
File.open("test.txt", "r:UTF-8") do |file|
file.each_line do |line|
name, age = line.split(",")
puts "#{name.strip} 的年龄是 #{age.strip} 岁"
end
end
输出:
张三 的年龄是 25 岁
李四 的年龄是 30 岁
示例 2:用户交互
print "请输入一句话(中文):"
input = gets.chomp
puts "你输入了:#{input}"
8. 调试技巧
- 检查编码:用
puts some_string.encoding
确认字符串编码。 - 安装
pry
:调试工具,运行gem install pry
,在代码中用binding.pry
检查变量。 - 日志:将输出写入文件,检查文件编码是否正确。
下一步
- 试试代码:告诉我你的环境(Linux/Windows)和想尝试的例子,我可以帮你调整。
- 解决问题:如果有乱码或编码问题,告诉我具体情况,我会帮你解决。
- 深入学习:想处理更复杂的中文场景(比如正则表达式或数据库)吗?我可以继续讲解。
你现在遇到什么具体问题吗?或者想直接试试某个例子?
发表回复