Разбор UTF-8 с Фарадеем - PullRequest
       12

Разбор UTF-8 с Фарадеем

0 голосов
/ 14 сентября 2018

Я делаю запрос API с Фарадеем в Ruby и анализирую его с JSON.parse.Проблема в том, что в ответе JSON есть такие предложения, как Longitud de la estaci\u00F3n meteorol\u00F3gica (grados), но это должно быть Longitud de la estación meteorológica (grados).

. Есть ли способ, как правильно разобрать это?У меня есть connection = Faraday.new(my_site), и если я делаю connection.get.body.encoding, тогда я получаю #<Encoding:ASCII-8BIT>, но когда я пытаюсь connection.get.body.force_encoding('ASCII-8BIT).force_encoding('UTF-8) или connection.get.body.force_encoding('ASCII-8BIT).encode('UTF-8), я получаю 'encode': "\xF3" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError).

Большое спасибо заранее!

1 Ответ

0 голосов
/ 17 сентября 2018

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

connection.get.body.force_encoding('ISO-8859-1').encode('UTF-8')

Я не знаю насчет Фарадея, но, судя по ошибке Encoding::UndefinedConversionError, возможно, так оно и есть. Я предполагаю, connection.get.body возвращает нормальный экземпляр String или его эквивалент.

Фон

Как говорится в официальном документе (версия 2.5.1) , вам не следует пытаться преобразовать ASCII-8BIT в любые другие кодировки:

Encoding :: ASCII_8BIT - это специальная кодировка, которая обычно используется для строки байтов, а не строки символов.

Так называемым расширенным ASCII, который содержит некоторые знаки препинания для алфавита, обычно является ISO-8859-1, хотя существуют и другие методы кодирования. Конечно, кодовая точка o с ' равна \ xF3 в ISO-8859-1. Вот фрагмент кода, чтобы продемонстрировать это:

"\xf3".force_encoding('ISO-8859-1').encode('UTF-8')
  # => "ó"
"\xf3".force_encoding('ASCII-8BIT').encode('UTF-8')
  # => Encoding::UndefinedConversionError 

Этот прошлый ответ объясняет это более подробно.

...