2017-11-17 17 views
0

を使用してください。open-uriopen()を使用すると、私のコントロール下にない任意のサーバからファイルを取得します。サーバは、ファイルのContent-Typeを指定することができる。 text/calendar; charset=utf-8またはtext/calendar; charset=ISO-8859-1です。この場合、open()は、その文字セットがサーバーの主張どおりであると信じることができてうれしいです。しかし、サーバが文字セットを指定していない場合、open()は文字セットが "ASCII-8BIT"であると思われます。 text/calendar、つまり「iCalファイル」は通常「UTF-8」としてエンコードする必要があるため、open()は、文字セットが「UTF-8」(文字セットが指定されていない場合)と仮定します。open-uriを使用してデフォルトの文字セットを指定しますが、サーバ提供の文字セットを使用する場合は

charsetが指定されていない場合には、と仮定するだけで、サーバの意思決定を尊重して任意の文字セットでファイルを提供することに重点を置いています。

open('http://my-test-uri.test', 'r:UTF-8')を試しましたが、サーバが "ISO-8859-1"のような異なる文字セットを指定していても、無条件にその文字セットをオーバーライドします。

答えて

0

OpenURI::Meta#charsetは、サーバーが文字セットを指定しなかった場合にのみ、文字セットを返すブロックを受け入れます。その情報を使用して

、我々はそれが持っていた同じエンコーディング(重複)のいずれかにまたは当社のデフォルトにopenによって返さStringIOのエンコーディングを設定することができます。

open('http://localhost:3333').tap do |io| 
    charset = io.charset { 'utf-8' } 
    io.set_encoding(charset) 
end 
関連する問題