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
设置编码后才能转码为其他编码的原因。
当使用 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
设置编码后才能转码为其他编码的原因。