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 默认使用 GBKWindows-1252 编码,可能导致中文乱码。解决方法:

  1. 切换终端编码
    在 CMD 中运行:
   chcp 65001

这将终端编码改为 UTF-8。

  1. 使用 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

处理乱码

如果遇到乱码:

  1. 确认源数据的编码(可以用 file 命令或编辑器检查)。
  2. force_encoding 强制指定编码:
   str = some_data.force_encoding("UTF-8")
  1. 如果仍无效,用 encode 转换并处理无效字符:
   str.encode("UTF-8", invalid: :replace, undef: :replace, replace: "?")

6. Windows 下的额外注意

Windows 默认编码可能是 GBKWindows-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)和想尝试的例子,我可以帮你调整。
  • 解决问题:如果有乱码或编码问题,告诉我具体情况,我会帮你解决。
  • 深入学习:想处理更复杂的中文场景(比如正则表达式或数据库)吗?我可以继续讲解。

你现在遇到什么具体问题吗?或者想直接试试某个例子?