在UTF-8环境中使用Ruby 1.9读取ASCII编码的文件

Doc*_*hes 5 ruby encoding ascii utf-8 ruby-1.9

我刚从Ruby 1.8升级到1.9,我的大多数文本处理脚本现在都因错误而失败invalid byte sequence in UTF-8.我需要删除无效字符或指定Ruby应该使用ASCII编码(或者C stdio函数编写的任何编码,文件的生成方式) - 我将如何进行这些操作?

最好是后者,因为(尽我所知)磁盘上的文件没有任何问题 - 如果有奇怪的,无效的字符,它们就不会出现在我的编辑器中......

tel*_*ent 1

你在 shell 中的区域设置是什么?在基于 Linux 的系统中,您可以通过运行locale命令来检查这一点并通过以下方式更改它:

$ export LANG=en_US
Run Code Online (Sandbox Code Playgroud)

我的猜测是,您正在使用具有 UTF-8 编码的区域设置,这导致 Ruby 假定文本文件是根据 utf-8 编码规则创建的。你可以通过尝试看到这一点

$ LANG=en_GB ruby -e 'warn "foo".encoding.name'
US-ASCII
$ LANG=en_GB.UTF-8 ruby -e 'warn "foo".encoding.name'
UTF-8
Run Code Online (Sandbox Code Playgroud)

对于 Ruby 1.9 中字符串编码如何变化的更一般处理,我强烈推荐 http://blog.grayproducts.net/articles/ruby_19s_string

(代码示例假设 bash 或类似的 shell - C-shell 衍生物不同)