Net::HTTP Ruby gem 是否忽略了我的 HTTP 响应中的 Content-type header?

Is the Net::HTTP Ruby gem ignoring the Content-type header in my HTTP responses?

当使用 Net::HTTP class(模块?)时,我似乎遇到了一个问题,即使响应将 Content-Type header 的字符集设置为相等对于 ISO-8859-1,响应的编码是 ASCII-8BIT。

我不是 100% 确定为什么这两种编码不同,或者它们有何不同,但我所知道的是,只有 ISO-8859-1 编码才能让我转码为 UTF-8。即:

require 'net/http'
 Net::HTTP.start(uri.host, uri.port) do |http|
  request = Net::HTTP::Get.new uri
  response = http.request request
end
response['Content-Type']
 => "text/html;charset=ISO-8859-1"
response.body.encoding
 => #<Encoding:ASCII-8BIT>
response.body.encode(Encoding::UTF_8)
Encoding::UndefinedConversionError: "\xE9" from ASCII-8BIT to UTF-8

这是怎么回事?如果我 force_encoding 响应的 body 到 Encoding::ISO_8859_1,那么转码工作。

Net::HTTP有错吗?

Ruby 不会自动设置响应的编码(参见 ticket),并且总是将编码设置为 ASCII-8BIT。

这是一个有点误导的编码名称,因为它实际上意味着 "arbitrary binary data"。这就是为什么需要使用force_encoding设置编码后才能转码为其他编码的原因。