2013-06-10 27 views
40

私はHpricotを使用するクローラを書いています。いくつかのWebページから文字列のリストをダウンロードし、それをファイルに書き込もうとします。何かがエンコーディングが間違っている:そうforce_encoding('UTF-8')は助けにはならない、Rubyで文字列をUTF8に変換する方法

Développement 

str.encoding戻りUTF-8

"\xC3" from ASCII-8BIT to UTF-8 

私は、Webページ上でレンダリングされ、このように印刷されたアイテムを持っています。これを読み込み可能なUTF-8に変換するにはどうすればよいですか?

+2

、鋸山の使用を検討していない: –

答えて

51

あなたの文字列が間違った方法でラウンドエンコードされているようだ:

"Développement".encode("iso-8859-1").force_encoding("utf-8") 
#=> "Développement" 
+0

ほとんどの場合、うまく動作します。しかし時には:UTF-8からCIDEM/ACC1のISO-8859-1へのU + 201C「 」Citiの持続可能な開発投資におけるUTF-8からISO-8859-1へのU + 20ACでは、 t。また、いくつかの名前は変換されていますが間違っていますので、 '不完全なマルチバイト文字 'というエラーメッセージが表示されたデータベースにシードすることはできません – ciembor

+1

申し訳ありませんが、これは修正を意味するものではありません。文字列をアプリに読み込むときに正しいエンコーディングを設定/検出することで、問題を解決する必要があります。 – Stefan

+0

@Stefan、素晴らしいソリューション、ありがとう! – gaussblurinc

37

は、あなたの文字列が、それはUTF-8であると考えているようだが、実際に、それは何か他のもの、おそらくISO-8859-1です。

最初に正しいエンコーディングを定義(強制)してから、UTF-8に変換します。あなたの例では

puts "Développement".encode('iso-8859-1').encode('utf-8') 

選択肢は次のとおりです。

puts "\xC3".force_encoding('iso-8859-1').encode('utf-8') #-> Ã 

Ãが意味をなさない場合は、別のエンコーディングを試してみてください。

Hpricotはもはや維持されている
file_contents.encode!('UTF-16', 'UTF-8') 
3

"ruby 1.9: invalid byte sequence in UTF-8"

は少ないコードで別の良い方法を説明しました。また、元のWebページのエンコーディングが何であるかについても言及する必要があります。
関連する問題