2012-10-18 10 views
32

私のレールアプリでは世界中のRSSフィードを扱っていますが、一部のフィードにはUTF-8以外のリンクがあります。元のフィードリンクは私のコントロール外です。アプリの他の部分でそれらを使用するには、UTF-8にする必要があります。任意のエンコーディングから文字列をUTF-8に変換する

エンコードを検出してUTF-8に変換するにはどうすればよいですか?

+0

を持っていることを、あなたは文書の添付メタ情報を解析するために必要なもの、に関係なく保証しますタグ。 – deceze

答えて

48

に変換したい:

を3210
str = str.force_encoding("UTF-8") 

str.encoding.name # => 'UTF-8' 

あなたが変換を実行したい場合は、encodeを使用します。

begin 
    str.encode("UTF-8") 
rescue Encoding::UndefinedConversionError 
    # ... 
end 

私は間違いなくより多くの情報については、以下の記事を読んでいました:
http://graysoftinc.com/character-encodings/ruby-19s-string

+0

答えに感謝して、記事も良い読書でした。 –

+0

は動作しません: whois = whois.force_encoding( "UTF-8")\ n whois.encoding.name => "UTF-8" \ n whois.scan(/ role:\ s +(。+)/ ArgumentError:UTF-8で無効なバイトシーケンス – Hackeron

+0

前述のように、force_encodingは文字を変換せず、無効なUTF-8バイトシーケンスを魔法のように解釈できません。 – kwarrick

4

Iconv

require 'iconv' 
i = Iconv.new('UTF-8','LATIN1') 
a_with_hat = i.iconv("\xc2") 

概要:iconvの宝石は、エンコーディングを変換するすべての作業を行います。それは一緒にインストールだことを確認します(。なし固有のエンコーディングで)今

gem install iconv 

、あなたの文字列をコードする現在でのRuby 1.8のお菓子バイトの配列として文字列としてであるかを知る必要があるたとえば、あなたの文字列だったと言いますlatin1の中に、あなただけのエンコーディングに変更しかし、それは文字を変換しません、エンコーディングは簡単で、「強制」

Ruby 1.9のUTF-8

require 'iconv' 

string_in_utf8_encoding = Iconv.conv("UTF8", "LATIN1", string_in_latin1_encoding) 
+0

答えがありがとうございますが、私の場合はソースデータが矛盾していて、実際には符号化を先取りする信頼できる方法がありません –

+4

Iconvはもう使用しないでください。 (廃止された)http://stackoverflow.com/questions/8148762/iconv-deprecation-warning-with-ruby-1-9-3 – basgys

21

これは、あなたが正しいエンコーディングを持っていることを確認し、無効または未定義の文字を空の文字列に置き換えるため、エラーは発生しません。

これはつまり、HTTPヘッダーまたは ` `、あなたはエンコーディングを検出するために有効なUTF-8文字列

str.encode(Encoding.find('UTF-8'), {invalid: :replace, undef: :replace, replace: ''}) 
関連する問題