2011-09-12 7 views
4

私はUTFに変換したいASCII-BIT8文字列を含むデータのハッシュを提供する不正な宝石(omniauth)を持っています。は非UTF文字を含むハッシュをUTFに変換します

ハッシュのすべての文字列要素をUTFに強制するにはどうすればよいですか? .to_utf8

session[:omniauth] = omniauth.to_utf8 

class Hash 
    def to_utf8 
    #not really sure what to do here? 
    end 
end 

答えて

8

initilizer Ruby 1.9のでは、通常はencode方法を用いた符号を反転させることができます。この試す

class Hash 
    def to_utf8 
    Hash[ 
     self.collect do |k, v| 
     if (v.respond_to?(:to_utf8)) 
      [ k, v.to_utf8 ] 
     elsif (v.respond_to?(:encoding)) 
      [ k, v.dup.encode('UTF-8') ] 
     else 
      [ k, v ] 
     end 
     end 
    ] 
    end 
end 
+0

非常に素晴らしい答え – apneadiving

+0

を私は取得しています再帰的にこれは簡単になりませんsymbolize_keysとは異なり、ハッシュを変換し、このラッパーASCII-8BITから変換エラーが発生しました。コンソールから正常に機能しました。エンコーディング:: UndefinedConversionErrorユーザーの:: OmniauthCallbacksController#google_apps "\ xC3"からASCII-8BITへUTF-8 – holden

+0

UTF-8相当(Ã)が必要ですが、この変換はデフォルトではサポートされていないようです。 'v.dup.force_encoding( 'WINDOWS-1252')。encode( 'UTF-8')' – tadman

0

:それは完璧に動作するはずのように見えます

json_string = not_encoded_hash.to_json.dup.encode("UTF-8") 
encoded_hash = JSON.parse(json_string).with_indifferent_access 
+2

'to_json'は'ソースシーケンスが不正/不正な形式のutf-8 ' – radubogdan

関連する問題