所以我们系统中的一些用户正在复制和粘贴文本到我的应用程序中。在我的日志中,我偶尔会注意到这个:
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 xE2x80x93 West Region"}}
问题是字符编码是关闭的。我的应用程序设置为UTF-8,我相信它们正在发送ASCII字符。我需要一种方法来过滤它,这样我就可以避免上面的错误。
注意,错误甚至在到达我的应用程序之前就被引发了。因此,我认为最好的解决方案是过滤用户输入以确保其正确编码的Rack中间件。
有什么最好的方法可以做到这一点吗?如果无效字符被替换为问号,我100%没问题。或者返回一个响应,说您的输入有无效字符。现在他们只是得到一个通用的错误,而在ajax请求中他们什么也得不到。
谢谢。
参见RVM, Ruby 1.9.2, Rails 2.3.8, Passenger和' invalid byte sequence in 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
确保你所有的视图都有这样一行:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
任何浏览器都将发送由HTML的字符集指定的编码表单数据。因此,用户从哪里复制粘贴数据并不重要,浏览器将负责在post时将数据转换为UTF8。