как преобразовать кодировку символов с помощью ruby 1.9
в настоящее время у меня проблемы с результатами api amazon.
сервис возвращает строку с символами Юникода: Learn ObjectivexE2x80x93C на компьютере Mac (серия Learn)
с 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)
2 ответов
в качестве точек исключения ваша строка кодируется 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"
решение Младена работает, если все, что кодируется в ASCII-8BIT, может быть преобразовано непосредственно в UTF-8. Он ломается, когда есть символы, которые являются 1) недопустимыми или 2) неопределенными в UTF-8. Однако, это будет работать (в 1.9.2 и выше:
new_str = s.encode('utf-8', 'binary', :invalid => :replace,
:undef => :replace, :replace => '')
ASCII-8BIT является фактически двоичным. Этот код преобразует кодировку в UTF-8, при этом правильно обрабатывая недопустимые и неопределенные символы. Параметр: invalid указывает на замену недопустимых символов. Опции :фдоон указывает, что неопределенные символы должны быть заменены. И параметр: replace определяет, на что следует заменить недопустимые или неопределенные символы. В данном случае, я решил просто удалить их.