gpt4 book ai didi

ruby - Encoding::UndefinedConversionError 使用 open-uri 时

转载 作者:太空宇宙 更新时间:2023-11-03 17:15:38 24 4
gpt4 key购买 nike

当我这样做时:

require 'open-uri'
response = open('some-html-page-url-here')
response.read

在某个 url 上我收到以下错误(由于返回的 url 中的编码错误?!):

Encoding::UndefinedConversionError: U+00A0 from UTF-8 to US-ASCII

有什么方法可以解决此问题以仍然获取 html 内容?

最佳答案

在 open-uri 模块的介绍中,文档是这样说的,

It is possible to open an http, https or ftp URL as though it were a file

如果您了解有关读取文件的任何知识,那么您必须知道您尝试读取的文件的编码。您需要知道编码,以便告诉 ruby​​ 如何读取文件(即每个字符将占用多少字节(或多少空间))。

在文档的第一个代码示例中,有这样的:

  open("http://www.ruby-lang.org/en") {|f|
f.each_line {|line| p line}
p f.base_uri # <URI::HTTP:0x40e6ef2 URL:http://www.ruby-lang.org/en/>
p f.content_type # "text/html"
p f.charset # "iso-8859-1"
p f.content_encoding # []
p f.last_modified # Thu Dec 05 02:45:02 UTC 2002
}

因此,如果您不知道要读取的"file"的编码,您可以使用 f.charset 获取编码。如果该编码不同于您的默认外部编码,您很可能会收到错误。您的 default external encoding 是 ruby​​ 用于从外部源读取的编码。您可以检查您的默认外部编码设置如下:

The default external Encoding is pulled from your environment...Have a look:

$ echo $LC_CTYPE
en_US.UTF-8

$ ruby -e 'puts Encoding.default_external.name'
UTF-8

http://graysoftinc.com/character-encodings/ruby-19s-three-default-encodings

在 Mac OSX 上,我实际上必须执行以下操作才能查看默认的外部编码:

$ echo $LANG

您可以使用 Encoding.default_external=() 方法设置您的默认外部编码,因此您可能想尝试这样的事情:

  open('some_url_here') do |f|
Encoding.default_external = f.charset
html = f.read
end

将一个 IO 对象设置为 binmode,就像您所做的那样,告诉 ruby​​ 文件的编码是 BINARY(或 ruby​​ 令人困惑的同义词 ASCII-8BIT),这意味着您告诉 ruby​​ 文件中的每个字符占用一个字节。在你的例子中,你告诉 ruby​​ 读取字符 U+00A0,它的 UTF-8 表示占用两个字节 0xC2 0xA0,作为两个字符而不是一个字符,所以你已经消除了你的错误, 但你产生了两个垃圾字符而不是原始字符。

关于ruby - Encoding::UndefinedConversionError 使用 open-uri 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24936452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com