UTF-8 中的无效字节序列 (ArgumentError)

Posted

技术标签:

【中文标题】UTF-8 中的无效字节序列 (ArgumentError)【英文标题】:Invalid byte sequence in UTF-8 (ArgumentError) 【发布时间】:2015-07-04 19:38:09 【问题描述】:

我正在尝试运行 Ruby 脚本,但总是在这一行出现错误:

file_content.gsub(/dr/i,'med')

我试图用“med”替换“dr”。

错误是:

program.rb:4:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)

为什么会这样,我该如何解决这个问题?

我正在使用 Ruby 2.2.1p85 的 MAC OS X Yosemite 机器。

【问题讨论】:

从变量名看来,您正在从文件中读取数据——对吗?文件来自哪里,你是如何阅读它的?你知道文件的实际编码吗? 【参考方案1】:

可能你的字符串不是 UTF-8 格式,所以使用

if ! file_content.valid_encoding?
  s = file_content.encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode('UTF-8')
  s.gsub(/dr/i,'med')
end

参见“Ruby 2.0.0 String#Match ArgumentError: invalid byte sequence in UTF-8”。

【讨论】:

感谢您的回复。如何使用您提供的代码 sn-p?因为当我在我的程序中立即使用它时,我得到:未定义的局部变量或方法's' for main:Object (NameError)。谢谢 使用file_content 而不是s 在我的问题中显示的行之前,我有以下代码行:“file_content = IO.read(filename)”。我已将您的代码放在此行之后,我的问题中的行之前,并且确实仍然遇到同样的问题 @Simplicity 你使用的是 Ruby 2.2,所以你可以使用 scrub 方法。对于没有scrub 的旧版本,这种技术确实是一种解决方法。 (但实际上你应该弄清楚编码实际上是什么并正确转换它,否则你会丢失数据)。 对我来说,这救了我***.com/a/19103433/7365329

以上是关于UTF-8 中的无效字节序列 (ArgumentError)的主要内容,如果未能解决你的问题,请参考以下文章

ruby 1.9:UTF-8 中的无效字节序列

2字节的UTF-8序列的字节2无效 解决方案

1字节的UTF-8序列的字节1无效

Ruby/Rails CSV 解析,UTF-8 中的无效字节序列

xml 3 字节的 UTF-8 序列的字节 3 无效

部署到 AWS Elastic Beanstalk 失败,出现异常“UTF-8 中的字节序列无效”