2013-08-03 2 views
2

мы используем Rails 3 и Spree Commerce для нашего интернет-магазина, и у нас есть поставщик платежей, который возвращает ошибки в URL-адресе перенаправления, если они возникают. Когда возникает ошибка, мы представляем эту строку флэш-сообщениям пользователю.Неверная последовательность байтов в UTF-8 с флэш-сообщениями Rails

Вчера что-то не работает, а поставщик платежных возвращается эта строка в URL переадресации, который должен быть представлен пользователю в сообщении вспышки:

errormsg=Bitte+versuchen+Sie+es+sp%E4ter+nochmals. 

Я отлажен немного, и строка выглядит следующим образом при декодировании (например, записывается на флэш [: ошибка]):

Bitte versuchen Sie es sp\xE4ter nochmals. 

И после этого, возникает ошибка, когда рельсы пытается оказать мгновенное сообщение:

invalid byte sequence in UTF-8 

Может кто-нибудь сказать мне, как это исправить? Ошибка должна содержать немецкий ä, а не \xE4. Я попытался установить # encoding: utf-8 в начало контроллера и вид, но это не помогает.

+0

У вас есть * любой * контроль над тем, как поставщик платежей генерирует URL-адрес? –

+0

Да, я могу указать URL-адрес переадресации, и поставщик добавляет параметры. После этого я могу делать все, что захочу, с параметрами. Я думал о принудительной кодировке UTF-8 или об этом. Но я не могу понять, как отобразить правильный символ 'ä' – 23tux

+0

Ну, если вы можете решить, какую кодировку использует провайдер, вы можете декодировать их параметры, а затем перекодировать их в UTF-8 ... (Или просто не перекодировать, если вам просто нужно это как tetx.) –

ответ

3

«Очевидно, ваш поставщик платежей использует ISO-8859-1 или аналогичный для отправки немецких умляутов.
Как ваше приложение для рельсов использует UTF-8, вы можете конвертировать сообщение своего сундука.

Предположим, что вы сохранили сообщение в переменной сообщ используйте

utf_msg = params[:errormsg].force_encoding('ISO-8859-1').encode('UTF-8') 

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

uft_msg.valid_encoding? 

и outpunt другое сообщение, чтобы избежать ошибок.

+0

Спасибо за ваш ответ! Я просто прокомментировал свой оригинальный пост. Есть ли разница между «force_encoding» и методом, который я использовал? И в чем разница между «ISO-8859-1» и «ISO-8859-15»? – 23tux

+0

, помещая комментарий '# - * - кодирование: UTF-8 - * -' в контроллере задает кодировку символов для исходного кода **, позволяя использовать umlauts в строковых литералах (например, 'notice: 'gelöscht' '). Он не влияет на ваши строковые переменные. Каждая переменная может иметь другую кодировку. См. Http://www.ruby-doc.org/core-2.0/String.html –

+0

Разница между 'ISO-8859-1' и' ISO-8859-1' немного верна. то есть «ISO-8859-15» определяет символ евро '' '. –

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