【发布时间】: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