我在Ruby(1.9)中编写了一个爬虫程序,它从很多随机站点中消耗了大量的HTML.
当试图提取链接时,我决定使用.scan(/href="(.*?)"/i)
而不是nokogiri/hpricot(主要加速).问题是我现在收到很多" invalid byte sequence in UTF-8
"错误.
根据我的理解,该net/http
库没有任何特定于编码的选项,并且所引入的内容基本上没有正确标记.
实际使用传入数据的最佳方法是什么?我尝试.encode
使用替换和无效选项集,但到目前为止没有成功...
在Ruby 1.9.3中,可以使用String.encode来"忽略"无效的UTF-8序列.这是一个可以在1.8(iconv)和1.9(String #coding)中工作的片段:
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
或者如果你有非常麻烦的输入,你可以进行从UTF-8到UTF-16并返回到UTF-8的双重转换:
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
接受的答案和其他答案对我有用.我发现这个职位这表明
string.encode!('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
这解决了我的问题.
我目前的解决方案是运行:
my_string.unpack("C*").pack("U*")
这将至少摆脱我的主要问题的例外
试试这个:
def to_utf8(str) str = str.force_encoding('UTF-8') return str if str.valid_encoding? str.encode("UTF-8", 'binary', invalid: :replace, undef: :replace, replace: '') end