2011-10-27 8 views
2

私たちのシステムのユーザーの一部は、テキストをコピーして自分のアプリに貼り付けています。私のログでは、時々これに気づくでしょう: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リクエストでは何も得られません。

ありがとうございました。

+0

これはブラウザのリクエストですか? –

+0

"私のアプリケーションはUTF-8用に設定されており、ASCII文字を送信していると思います。 「ASCII文字」を送信している場合は、「UTF-8文字」も送信しています。すべてのASCIIバイト文字列は、有効なUTF-8バイト文字列です。 – Thanatos

答えて

0

は、すべてのあなたの意見は次のような行を持っていることを確認してください:

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

どれブラウザがHTMLのcharsetで指定されたエンコードされたフォームデータを送信します。したがって、ユーザーがどこからデータをコピーして貼り付けても問題はありません。ブラウザーは投稿時にデータをUTF8に変換して処理します。

+0

うん、私は正確なメタタグを持っています。私の推測では、マイクロソフトはそれを尊重しないことにしました。しかし、そのメタタグは私のページのすべてにあります。それが簡単なのであれば素晴らしいだろう。 –

関連する問題