Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

recursively convert hash containing non-UTF chars to UTF

I have a rogue gem (omniauth) which provides a hash of data containing ASCII-BIT8 strings that I would like to convert into UTF.

How can I force all of the string elements of the hash into UTF, as some kind of rails initializer method? .to_utf8

initilizer

session[:omniauth] = omniauth.to_utf8

class Hash
  def to_utf8
    #not really sure what to do here?
  end
end
like image 988
holden Avatar asked Feb 24 '23 00:02

holden


1 Answers

In Ruby 1.9 you can usually just flip the encoding using the encode method. A wrapper around this that recursively transforms the hash, not unlike symbolize_keys makes this straightforward:

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
like image 180
tadman Avatar answered Mar 05 '23 12:03

tadman