рекурсивно конвертировать хэш, содержащий не UTF-символы, в UTF - PullRequest
4 голосов
/ 12 сентября 2011

У меня есть жулик-мошенник (omniauth), который предоставляет хэш данных, содержащий строки ASCII-BIT8, которые я хотел бы преобразовать в UTF.

Как заставить все строковые элементы хеша преобразовать вUTF, как метод инициализации рельсов?.to_utf8

инициализатор

session[:omniauth] = omniauth.to_utf8

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

Ответы [ 2 ]

9 голосов
/ 12 сентября 2011

В Ruby 1.9 обычно можно просто перевернуть кодировку, используя метод encode.Обертка вокруг этого, которая рекурсивно преобразует хеш, мало чем отличается от symbolize_keys, делает это простым:

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 голосов
/ 03 апреля 2013

попробуйте это:

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