【问题标题】:Ruby on Rails: how to handle wrong encoded JSON string on receiveRuby on Rails:如何在接收时处理错误编码的 JSON 字符串
【发布时间】:2013-03-06 08:19:37
【问题描述】:

我有一个 Rails 服务器从一个 android 应用程序获取输入。这个 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 still gives "invalid byte sequence in 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​​ 包上......?

【问题讨论】:

  • 有趣的是,即使使用 Apache,日志文件也包含带有转义特殊字符的整个文本。如果我能像这样把它放到数据库中,这对我来说真的足够了。

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


【解决方案1】:

幸运的是,我找到了这个棘手问题的答案 - 结果证明这是数据库级别的问题!
令人惊讶的是 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/

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

【讨论】:

    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 2012-07-23
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多