Ruby on Rails:如何在接收时处理错误的编码JSON字符串

时间:2013-03-06 08:19:38

标签: apache utf-8 ruby-on-rails-3.1 passenger webrick

我有一个rails服务器从Android应用程序获取输入。这个Android应用程序以JSON格式将一些数据传递给服务器,但是当前版本的应用程序不会将字符串编码为UTF-8,因此它仍然是“二进制”的,例如'\ xE0'而不是'\ uE0'。但是当将这个二进制字符串发送到服务器时,应用程序将http连接设置为编码UTF-8,这意味着接收此字符串的Web服务器认为,它是以UTF-8编码的,但实际上它是编码为“二进制”的。

我用以下一行解决了这个问题:

# encode comment to UTF-8 and strip whitespace from comment field
params[:data][:text].encode('utf-8', 'binary', :invalid => :replace, :undef => :replace).gsub!(/\s+/, " ")

这是从这里取的:Ruby String.encode still gives "invalid byte sequence in UTF-8"

它在我的开发系统上工作正常,在Web服务器WEBrick中启动构建,但不幸的是,这给我在Apache / Passenger上运行的生产系统带来了不同的行为,它不会用'?'替换错误的字符。但是在第一个无效的时候会中断。

在WEBrick上我得到了

'  so un\xE4hnlich   ' => 'so un?hnlich'

在Apache上使用相同的代码,ruby(1.9.3)和rails(3.1.1)版本,我得到了

'  so un\xE4hnlich   ' => 'so un'

我必须要做的事情,我不知道在哪里尝试:在apache配置,代码上,在ruby包上......?

1 个答案:

答案 0 :(得分:0)

幸运的是,我找到了这个棘手问题的答案 - 事实证明,这是数据库级别的问题!
令人惊讶的是rake db:create:所有语句确实创建了生成db WITH编码UTF-8,就像在database.yml中配置一样,但它确实用(MySQL默认)LATIN-1作为开发数据库,​​尽管这也标记为使用UTF- 8在同一个database.yml文件中 对于遇到此问题的未来用户:请查看您的database.yml文件以获取数据库的编码。

development:
  adapter: mysql2
  encoding: utf8
[...]

test:
  adapter: mysql2
  encoding: utf8
[...]

production:
  adapter: mysql2
  encoding: utf8
[...]

由于此博客,我可以理解完整的编码内容:http://yehudakatz.com/2010/05/05/ruby-1-9-encodings-a-primer-and-the-solution-for-rails/

问题中的代码可以正常工作,如果您了解,要发送到数据库的编码...