如何在Ruby脚本运行时内部设置默认字符串编码?
在Ruby脚本内部设置全局默认编码的方法
核心设置:Encoding.default_external + Encoding.default_internal
你之前单独设置Encoding.default_internal没生效,问题出在没配合default_external,或者设置时机太晚——必须在脚本最开头、任何字符串/文件操作前定义。
正确写法(放在脚本最顶部,shebang之后):
# encoding: utf-8 Encoding.default_external = 'ISO-8859-1' Encoding.default_internal = 'ISO-8859-1'
default_external:控制Ruby读取外部数据(文件名、文件内容、环境变量)的默认编码default_internal:控制Ruby内部字符串的存储编码,外部数据会自动转成这个编码存储
解决文件名编码报错的针对性处理
你碰到的invalid byte sequence in UTF-8错误,是因为Ruby处理文件名时默认遵循系统文件系统编码(比如Linux默认UTF-8),单独修改default_external可能不够,需要显式处理文件名编码:
方案一:获取文件名后强制转码
Dir.entries('.').each do |raw_filename| # 先按目标编码解析原始字节,再转成内部编码 encoded_filename = raw_filename.force_encoding('ISO-8859-1').encode(Encoding.default_internal) # 后续操作使用encoded_filename end
方案二:直接指定文件系统编码(部分Ruby版本支持)
Encoding.default_external = 'ISO-8859-1' # 强制设置文件系统编码 Encoding.find('filesystem').name = 'ISO-8859-1'
模拟ruby -E参数的效果
如果想完全复刻命令行-Eencoding的作用,用上面的default_external+default_internal组合就够了——这是Ruby官方推荐的内部设置方式。别用已废弃的$KCODE(Ruby 2.0+已淘汰该变量)。
验证设置是否生效
可以添加几行代码确认编码配置:
puts "默认外部编码: #{Encoding.default_external}" puts "默认内部编码: #{Encoding.default_internal}" puts "文件系统编码: #{Encoding.find('filesystem')}"
内容的提问来源于stack exchange,提问作者HippoMan
相关产品推荐
相关产品推荐

