Проблема с кодировкой JSON в Ruby 1.9 и HTTParty - PullRequest
1 голос
/ 10 ноября 2010

Я создал WebAPI, который возвращает JSON.

Исходные данные следующие (в кодировке UTF-8):

@text="Rosenborg har ikke h\xC3\xB8rt hva Steffen"

Затем с .to_json на моем объекте,Вот что посылает API (я думаю, что это кодировка ISO-8859-1):

"text":"Rosenborg har ikke h\ufffd\ufffdrt hva Steffen"

Я использую HTTParty на стороне клиента, и вот, наконец, я получаю:

"text":"Rosenborg har ikke h��rt hva"

И WebAPI, и клиентское приложение используют Ruby 1.9.2 и Rails 3.

Я немного растерялся из-за этой проблемы с кодировкой ... Я попытался добавить заголовок кодировки utf8 в свойРубиновые файлы, но это ничего не изменило.Я предполагаю, что где-то отсутствует часть кодирования / декодирования ... у кого-нибудь есть идея?

Большое спасибо !!!Винсент

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Хорошо, я наконец выяснил, в чем проблема ...

Я использую RSolr для получения моих данных от Solr, и по умолчанию кодировка для всех результатов, к сожалению, является US-ASCII, как указано здесь (и проверено мной): http://groups.google.com/group/rsolr/browse_thread/thread/2d4890fa7737e7ef#

Таким образом, вам нужно принудительно выполнить кодировку следующим образом:

my_string.force_encoding(Encoding::UTF_8)

Возможно, есть хорошая опция кодирования для RSolr!

1 голос
/ 10 ноября 2010

В Ruby 1.9 кодировка теперь явная.Однако Rails может или не может быть настроен на отправку ответов в ожидаемой вами кодировке.Вам нужно установить глобальную настройку конфигурации:

Encoding.default_external = "utf-8".

Я считаю, что кодировка, которую Ruby определяет по умолчанию для сериализации, - это платформа по умолчанию.В Америке на Windows это будет CodePage-1251.Другие страны будут иметь альтернативную кодировку.

Редактировать : также смотрите этот URL, если JSON выполняется для MySQL: https://rails.lighthouseapp.com/projects/8994/tickets/5210-encoding-problem-in-json-format-response

Редактировать2 : ядро ​​Rails и его набор библиотек (ActiveRecord и др.) Будут учитывать параметр конфигурации Encoding.default_external, который кодирует все отправляемые им значения.К сожалению, поскольку кодирование является относительно новой концепцией для Ruby, не каждая сторонняя библиотека была настроена для правильного кодирования.Те, которые имеют, могут потребовать дополнительных настроек конфигурации для этих библиотек.Это включает в себя MySQL и библиотеку RSolr, которую вы использовали.

Во всех версиях Ruby до серии 1.9 строка представляла собой просто массив байтов.Когда вы так долго думали, трудно обдумать концепцию кодирования нескольких строк.Еще более запутанным является то, что в отличие от Java, C # и других языков, которые используют некоторую форму UTF в качестве собственного формата строки, Ruby позволяет по-разному кодировать каждую строку.Оглядываясь назад, это может быть ошибкой, но, по крайней мере, теперь они соблюдают кодировку.

Метод Encoding.force_encoding предназначен для обработки последовательности байтов с помощью этой новой кодировки, но не изменяет какие-либо базовые данные.,Таким образом, возможно иметь недопустимые последовательности байтов.Существует еще один метод, называемый .encode(), который преобразует байты из одной кодировки в другую и гарантирует действительные последовательности байтов.Для получения дополнительной информации читайте это:

http://blog.grayproductions.net/articles/ruby_19s_string

...