我有一个从 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 包上......?