首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从iso-8859编码的网页返回ASCII-8位

从iso-8859编码的网页返回ASCII-8位
EN

Stack Overflow用户
提问于 2011-04-19 05:43:43
回答 1查看 3.2K关注 0票数 7

我正在使用open来读取一个声称编码在iso-8859-1中的网页.当我读取页面的内容时,open-uri返回一个以ASCI-8位编码的字符串。

代码语言:javascript
复制
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>] 

我猜这是因为网页的字节(或字符) \x92不是有效的iso-8859字符。http://en.wikipedia.org/wiki/ISO/IEC_8859-1

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

EN

回答 1

Stack Overflow用户

发布于 2011-06-23 14:26:52

  • ASCII-8BIT is an alias for BINARY
  • open-uri做了一件有趣的事情:如果文件小于10 if (或类似的东西),它返回一个String,如果它更大,则返回一个StringIO。如果您试图处理编码问题,这可能会令人困惑。

如果文件不是很大,我建议手动将它们加载到字符串中:

代码语言:javascript
复制
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

然后,您可以使用https://rubygems.org/gems/ensure-encoding宝石。

代码语言:javascript
复制
require 'ensure/encoding'
utf8_body = body.ensure_encoding('UTF-8', :external_encoding => :sniff, :invalid_characters => :transcode)

我和ensure-encoding在一起很开心.我们在http://data.brighterplanet.com的生产中使用它

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

此外,如果您不知何故知道编码,可以传递:external_encoding => 'ISO-8859-1'而不是:sniff

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5712096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档