ruby 1.9出现“UTF-8中的无效字节序列”错误怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

我在Ruby(1.9)中编写了一个爬取器 当试图提取链接时,我决定只使用.scan(/href="(.*?)"/i)而不用nokogiri / hpricot(能加速)。问题是我现在收到很多invalid byte sequence in UTF-8”错误。 根据我的理解,该net/http库没有任何编码特定的选项,而进入的内容基本上没有正确标记。 实际使用传入数据的最佳方式是什么?

提问于
用户回答回答于

string.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')

这为我解决了这个问题。

用户回答回答于

在Ruby 1.9.3中,可以使用String.encode来“忽略”无效的UTF-8序列。这是一个可以在1.8(iconv)和1.9(String#encode)中工作的代码片段:

require 'iconv' unless String.method_defined?(:encode)
if String.method_defined?(:encode)
  file_contents.encode!('UTF-8', 'UTF-8', :invalid => :replace)
else
  ic = Iconv.new('UTF-8', 'UTF-8//IGNORE')
  file_contents = ic.iconv(file_contents)
end

或者:

require 'iconv' unless String.method_defined?(:encode)
if String.method_defined?(:encode)
  file_contents.encode!('UTF-16', 'UTF-8', :invalid => :replace, :replace => '')
  file_contents.encode!('UTF-8', 'UTF-16')
else
  ic = Iconv.new('UTF-8', 'UTF-8//IGNORE')
  file_contents = ic.iconv(file_contents)
end

扫码关注云+社区