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

Как конвертировать кодировку символов с ruby ​​1.9

В настоящее время у меня возникают проблемы с результатами amazon api.

служба возвращает строку с символами Unicode: Learn Objective\xE2\x80\x93C на Mac (серия обучения)

с ruby ​​1.9.1 строка не могла даже обрабатываться:

REXML::ParseException: #<Encoding::CompatibilityError: incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string)>

...

Exception parsing

Line: 1

Position: 1636

Last 80 unconsumed characters:

Learn Objective–C on the Mac (Learn Series)
4b9b3361

Ответ 1

В качестве точек исключения ваша строка кодируется ASCII-8BIT. Вы должны изменить кодировку. Существует длинный рассказ об этом, но если вы заинтересованы в быстром решении, просто force_encoding в строке перед обработкой:

s = "Learn Objective\xE2\x80\x93C on the Mac"
# => "Learn Objective\xE2\x80\x93C on the Mac"
s.encoding
# => #<Encoding:ASCII-8BIT>
s.force_encoding 'utf-8'
# => "Learn Objective–C on the Mac"

Ответ 2

Решение Mladen работает, если все, что закодировано в ASCII-8BIT, фактически может быть преобразовано непосредственно в UTF-8. Он прерывается, когда есть символы, которые 1) недействительны, или 2) undefined в UTF-8. Однако это будет работать (в 1.9.2 и выше:

new_str = s.encode('utf-8', 'binary', :invalid => :replace, 
  :undef => :replace, :replace => '')

ASCII-8BIT эффективно двоичный. Этот код преобразует кодировку в UTF-8, при этом правильно обрабатывает недействительные символы и символы undefined. Параметр: invalid указывает, что недопустимые символы должны быть заменены. Опция: undef указывает, что символы undefined заменяются. Опция: replace определяет, что нужно заменить недействительными или undefined символами. В этом случае я решил просто удалить их.