2015-09-11 53 views
0

當使用Net::HTTP類(Module?)時,我似乎有一個問題,即使響應將Content-Type頭設置爲charset等於ISO-8859-1,響應的編碼也是ASCII-8BIT。Net :: HTTP Ruby gem忽略了我的HTTP響應中的Content-type標頭?

我不是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響應的正文爲Encoding::ISO_8859_1,那麼轉碼工作。

Net::HTTP有問題嗎?

+0

您確定服務器響應有效嗎?也許服務器的開發者只是沒有設置正確的價值? – spickermann

+0

服務器響應有效;應該提到這一點。身體實際上編碼爲ISO-8859-1。但是看起來像我的猜測,「Net :: HTTP」在設計上只會假設爲「任意二進制」,因爲編碼是正確的,正如@ frederick-cheung在他的回答中所說的那樣。 – sameers

回答

1

Ruby不會自動設置響應的編碼(請參閱ticket),並始終將編碼設置爲ASCII-8BIT。

這是一個有點誤導性的編碼名稱,因爲它實際上意味着「任意二進制數據」。這就是爲什麼您需要使用force_encoding來設置編碼,然後才能轉碼爲其他編碼。