Подтвердить что ты не робот

Кодирование:: UndefinedConversionError

Я продолжаю получать Encoding::UndefinedConversionError - "\xC2" from ASCII-8BIT to UTF-8 каждый раз, когда я пытаюсь преобразовать хэш в строку JSON. Я попытался с [.encode | .force_encoding](["UTF-8" | "ASCII-8BIT" ]), привязав .encode с помощью .force_encoding, назад, переключив параметры, но ничего не работало, поэтому я поймал ошибку следующим образом:

begin
  menu.to_json
rescue Encoding::UndefinedConversionError
  puts $!.error_char.dump
  p $!.error_char.encoding
end

Если меню представляет собой сиквел dataset.to_hash с содержимым из базы данных MySQL DB, utf8_general_ci и возвращает это:

"\ xc2"

< #Encoding: ASCII-8BIT >

Кодировка никогда не изменяется, независимо от того, что я использую .encode/.force_encoding. Я даже попытался заменить строку .gsub!(/\\\xC2/) без везения.

Любые идеи?

4b9b3361

Ответ 1

menu.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')

Это сработало отлично, мне пришлось заменить некоторые дополнительные символы, но ошибок больше нет.

Ответ 2

Что вы ожидаете от "\ xC2"? Вероятно, a Â

С ASCII-8BIT у вас есть двоичные данные, и Ruby can not решит, что должно быть.

Сначала вы должны установить кодировку с помощью force_encoding.

Вы можете попробовать следующий код:

Encoding.list.each{|enc|
  begin
    print "%-10s\t" % [enc]
    print "\t\xC2".force_encoding(enc)
    print "\t\xC2".force_encoding(enc).encode('utf-8')
  rescue => err
    print "\t#{err}"
  end
  print "\n"
}

Результатом являются возможные значения в разных кодировках для вашего "\ xC2".

Результат может зависеть от вашего формата вывода, но я думаю, вы можете сделать хорошее предположение, какая у вас кодировка.

Когда вы определили нужную вам кодировку (возможно, cp1251), вы можете

menu.force_encoding('cp1252').to_json

См. также комментарий Kashyaps.

Ответ 3

Если вы не заботитесь о потере странных персонажей, вы можете сдуть их:

str.force_encoding("ASCII-8BIT").encode('UTF-8', undef: :replace, replace: '')

Ответ 4

Ваше автопринятое решение не работает, ошибок нет, но он НЕ JSON.

Я решил проблему с помощью oj gem, теперь она находит find. Он также быстрее, чем стандартная библиотека JSON.

Написание:

   menu_json = Oj.dump menu

Чтение:

   menu2 = Oj.load menu_json

https://github.com/ohler55/oj для получения дополнительной информации. Надеюсь, это поможет.