开发者

recursively convert hash containing non-UTF chars to UTF

开发者 https://www.devze.com 2023-04-04 03:44 出处:网络
I have a rogue gem (omniauth) which provides a hash of data containing ASCII-BIT8 strings that I would like to convert into 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

i开发者_StackOverflownitilizer

session[:omniauth] = omniauth.to_utf8

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


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


try this:

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

精彩评论

暂无评论...
验证码 换一张
取 消