私たちのシステムのユーザーの一部は、テキストをコピーして自分のアプリに貼り付けています。私のログでは、時々これに気づくでしょう: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リクエストでは何も得られません。
ありがとうございました。
これはブラウザのリクエストですか? –
"私のアプリケーションはUTF-8用に設定されており、ASCII文字を送信していると思います。 「ASCII文字」を送信している場合は、「UTF-8文字」も送信しています。すべてのASCIIバイト文字列は、有効なUTF-8バイト文字列です。 – Thanatos