Ответ 1
menu.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')
Это сработало отлично, мне пришлось заменить некоторые дополнительные символы, но ошибок больше нет.
Я продолжаю получать 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/)
без везения.
Любые идеи?
menu.to_s.encode('UTF-8', invalid: :replace, undef: :replace, replace: '?')
Это сработало отлично, мне пришлось заменить некоторые дополнительные символы, но ошибок больше нет.
Что вы ожидаете от "\ 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.
Если вы не заботитесь о потере странных персонажей, вы можете сдуть их:
str.force_encoding("ASCII-8BIT").encode('UTF-8', undef: :replace, replace: '')
Ваше автопринятое решение не работает, ошибок нет, но он НЕ JSON.
Я решил проблему с помощью oj gem, теперь она находит find. Он также быстрее, чем стандартная библиотека JSON.
Написание:
menu_json = Oj.dump menu
Чтение:
menu2 = Oj.load menu_json
https://github.com/ohler55/oj для получения дополнительной информации. Надеюсь, это поможет.