Ruby 打开uri,从iso-8859编码的网页返回ASCII-8BIT

Ruby 打开uri,从iso-8859编码的网页返回ASCII-8BIT,ruby,encoding,internationalization,open-uri,Ruby,Encoding,Internationalization,Open Uri,我正在使用开放uri阅读一个声称以iso-8859-1编码的网页。当我读取页面内容时,openuri返回一个用ASCII-8BIT编码的字符串 open("http://www.nigella.com/recipes/view/DEVILS-FOOD-CAKE-5310") {|f| p f.content_type, f.charset, f.read.encoding } => ["text/html", "iso-8859-1", #<Encoding:ASCII-8BIT&

我正在使用开放uri阅读一个声称以iso-8859-1编码的网页。当我读取页面内容时,openuri返回一个用ASCII-8BIT编码的字符串

open("http://www.nigella.com/recipes/view/DEVILS-FOOD-CAKE-5310") {|f| p f.content_type, f.charset, f.read.encoding }
 => ["text/html", "iso-8859-1", #<Encoding:ASCII-8BIT>] 
打开(“http://www.nigella.com/recipes/view/DEVILS-FOOD-CAKE-5310“”{| f | p f.content_type,f.charset,f.read.encoding}
=>[“文本/html”、“iso-8859-1”、#]
我猜这是因为网页的字节(或字符)\x92不是有效的iso-8859字符

我需要将网页存储为utf-8编码文件。关于如何处理编码不正确的网页的任何想法。我可以捕获异常并尝试猜测正确的编码,但这似乎很麻烦且容易出错。

  • ASCII-8BIT是二进制的别名
  • openuri
    做了一件有趣的事:如果文件小于10kb(或类似的大小),它将返回一个
    字符串
    ,如果它更大,它将返回一个
    StringIO
    。如果您试图处理编码问题,这可能会令人困惑
如果文件不是很大,我建议手动将它们加载到字符串中:

require 'uri'
require 'net/http'
require 'net/https'

uri = URI.parse url_to_file

http = Net::HTTP.new(uri.host, uri.port)
if uri.scheme == 'https'
  http.use_ssl = true
  # possibly useful if you see ssl errors
  # http.verify_mode = ::OpenSSL::SSL::VERIFY_NONE
end
body = http.start { |session| session.get uri.request_uri }.body
那你就可以用宝石了

我对
确保编码
非常满意。。。我们在工厂的生产中使用它

请注意,您也可以说
:invalid_characters=>:ignore
,而不是
:transcode


另外,如果您知道编码方式,您可以传递
:external\u encoding=>“ISO-8859-1”
而不是
:sniff

您使用的是什么版本的Ruby?我使用的是1.9.2。是,\x92表示CP1252。我正在寻找一个更通用的解决方案或想法,当编码未知或与html标题不一致时,如何解析html。我们可能会有所帮助。
require 'ensure/encoding'
utf8_body = body.ensure_encoding('UTF-8', :external_encoding => :sniff, :invalid_characters => :transcode)