0

我有一个从 android 应用程序获取输入的 Rails 服务器。这个 android 应用程序以 JSON 格式将一些数据传递给服务器,但当前版本的应用程序没有将字符串编码为 UTF-8,因此它仍然是“二进制”,例如“\xE0”而不是“\uE0”。但是当将此二进制字符串发送到服务器时,应用程序将 http 连接设置为编码 UTF-8,这意味着接收此字符串的网络服务器认为,它是以 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 仍然给出“UTF-8 中的无效字节序列”

它在我的开发系统上运行良好,在 webserver WEBrick 中开始构建,但不幸的是,这在我在 Apache/Passenger 上运行的生产系统上给出了不同的行为,它不会用“?”替换错误的字符。但在第一个无效的时候中断。

在 WEBrick 我得到

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

在具有相同代码、ruby (1.9.3) 和 rails (3.1.1) 版本的 Apache 上,我得到

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

一定有什么我可以做的,我不知道在哪里尝试:在 apache 配置上,在代码上,在 ruby​​ 包上......?

4

1 回答 1

0

幸运的是,我找到了这个棘手问题的答案——结果证明这是数据库级别的问题!
令人惊讶的是,rake db:create:all 语句确实创建了生产数据库 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/

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

于 2013-03-14T09:34:42.410 回答