open-uri 从以 iso-8859 编码的网页返回 ASCII-8BIT
我正在使用 open-uri 来读取声称以 iso-8859-1 编码的网页。当我读取页面内容时,open-uri 返回一个以 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>]
我猜测这是因为网页有字节(或字符)\x92,它不是有效的 iso-8859 字符。 http://en.wikipedia.org/wiki/ISO/IEC_8859-1 。
我需要将网页存储为 utf-8 编码文件。关于如何处理编码不正确的网页的任何想法。我可以捕获异常并尝试猜测正确的编码,但这似乎很麻烦且容易出错。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
ASCII-8BIT 是 BINARY
的别名open-uri
做了一件有趣的事情:如果文件小于 10kb(或类似的东西),它会返回一个String
,如果它更大,则返回一个StringIO
。如果您试图处理编码问题,这可能会令人困惑。如果文件不大,我建议手动将它们加载到字符串中:
然后您可以使用 https:// /rubygems.org/gems/ensure-encoding gem
我对
ensure-encoding
非常满意...我们在生产中使用它 http://data.brighterplanet.com请注意,您也可以说
:invalid_characters =>; :ignore
而不是:transcode
。另外,如果您以某种方式知道编码,您可以传递
:external_encoding =>; 'ISO-8859-1'
而不是:sniff
ASCII-8BIT is an alias for BINARY
open-uri
does a funny thing: if the file is less than 10kb (or something like that), it returns aString
and if it's bigger then it returns aStringIO
. That can be confusing if you're trying to deal with encoding issues.If the files aren't huge, I would recommend manually loading them into strings:
Then you can use the https://rubygems.org/gems/ensure-encoding gem
I have been pretty happy with
ensure-encoding
... we use it in production at http://data.brighterplanet.comNote that you can also say
:invalid_characters => :ignore
instead of:transcode
.Also, if you know the encoding somehow, you can pass
:external_encoding => 'ISO-8859-1'
instead of:sniff