我有一个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包上......?
答案 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/
问题中的代码可以正常工作,如果您了解,要发送到数据库的编码...