2010-11-10 3 views
1

Я создал WebAPI, который возвращает JSON.Проблема с кодировкой JSON с Ruby 1.9 и HTTParty

Исходные данные выглядит следующим образом (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" 

Оба WebAP Я и клиентское приложение используют Ruby 1.9.2 и Rails 3.

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

спасибо! Vincent

ответ

1

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

Encoding.default_external = "utf-8". 

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

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

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

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

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

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

+0

Как мне изменить кодировку для сериализации? –

+0

Проверьте мое второе редактирование. Он имеет гораздо больше информации о новых функциях кодирования Ruby 1.9 и о том, что вам нужно иметь в виду. –

+0

У меня проблема, но с sqlite3. Хорошо работает, когда я просматриваю представления, но с рендером: json. Я получаю эту точную проблему. –

1

Хорошо, я наконец-то узнал, что проблема ...

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

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

my_string.force_encoding(Encoding::UTF_8) 

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

+0

Это не ответ. – g33kz0r

Смежные вопросы