Как справиться с недопустимой последовательностью байтов для ввода пользователем через промежуточное ПО Rack?

Итак, некоторые пользователи нашей системы копируют и вставляют текст в мое приложение. В своих журналах я иногда замечаю следующее:

ArgumentError (invalid byte sequence in US-ASCII):
vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.14/lib/active_support/core_ext/object/blank.rb:68:in `=~'
vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.14/lib/active_support/core_ext/object/blank.rb:68:in `!~'
vendor/bundle/ruby/1.9.1/gems/activesupport-2.3.14/lib/active_support/core_ext/object/blank.rb:68:in `blank?'
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/response.rb:202:in `nonempty_ok_response?'
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/response.rb:188:in `handle_conditional_get!'
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/response.rb:141:in `prepare!'
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/base.rb:540:in `send_response'
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/base.rb:534:in `process'
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/filters.rb:606:in `process_with_filters'
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/base.rb:391:in `process'
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/base.rb:386:in `call'
vendor/bundle/ruby/1.9.1/gems/actionpack-2.3.14/lib/action_controller/routing/route_set.rb:438:in `call'

А вот детали запроса. Обратите внимание на недопустимые символы.

Parameters: {"attendee"=>{"segment"=>"Middle Market \xE2\x80\x93 West Region"}}

Проблема в том, что кодировки символов отключены. Мое приложение настроено для UTF-8, и я считаю, что они отправляют символы ASCII. Мне нужен способ отфильтровать это, чтобы избежать вышеуказанной ошибки.

Обратите внимание, что ошибка возникает еще до того, как она попадает в мое приложение. Поэтому я предполагаю, что лучшим решением является промежуточное ПО Rack, которое фильтрует вводимые пользователем данные, чтобы обеспечить правильную кодировку.

Есть идеи, как лучше всего этого добиться? Я на 100% в порядке, если недопустимые символы заменены вопросительным знаком. Или отправляется ответ, в котором говорится, что введенные вами данные содержат недопустимые символы. Сейчас они просто получают общую ошибку, а по запросам ajax ничего не получают.

Спасибо.


person Binary Logic    schedule 27.10.2011    source источник
comment
Мое приложение настроено для UTF-8, и я считаю, что они отправляют символы ASCII. Если они отправляют символы ASCII, они также отправляют символы UTF-8. Любая строка байтов ASCII является допустимой цепочкой байтов UTF-8.   -  person Thanatos    schedule 04.11.2011


Ответы (2)


См. RVM, Ruby 1.9.2, Rails 2.3.8, Passenger и недопустимая последовательность байтов в US-ASCII и https://rails.lighthouseapp.com/projects/8994/tickets/3941-invalid-byte-sequence-in-us-ascii-error-for-utf-8-localized-messages.

В основном вам нужно добавить

# encoding: UTF-8

в ваши исходные файлы.

person gioele    schedule 01.11.2011

Убедитесь, что все ваши представления имеют такую ​​строку:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Любой браузер будет отправлять данные формы, закодированные в соответствии с кодировкой HTML. Таким образом, не имеет значения, откуда пользователи копируют и вставляют данные, браузер позаботится о преобразовании данных в UTF8 при публикации.

person Tom De Leu    schedule 05.11.2011
comment
Да, у меня есть именно этот метатег. Я предполагаю, что Microsoft решила не уважать его. Но этот метатег есть на каждой из моих страниц. И было бы здорово, если бы все было так просто. - person Binary Logic; 20.11.2011