2

更新:经过进一步调查,我设法将问题缩小到 json 编码器。直接通过输入工作正常,但通过它MultiJson.encode是导致问题的原因。

我通过 curl 将以下内容发送到一个安静的 Web 服务:

$ curl -v -X POST "http://my/url" -d "{\"body\": \"\"}"

您可能看不到的字符是信用卡表情符号字符,即U+1F4B3。

我从服务中得到的响应基本上是:

< HTTP/1.1 200 OK
< Date: Wed, 30 Oct 2013 02:38:04 GMT
< Content-Type: application/json;charset=utf-8
< Content-Length: 266
< Connection: close
< 
{ [data not shown]
100   304  100   266  100    38    936    133 --:--:-- --:--:-- --:--:--   936
* Closing connection 0
{
  "body": "\uf4b3"
}

这个编码的字符与我发送的不对应,我希望它以发送的形式返回(在这种情况下)。

我可以访问服务器的源代码。它建立在 Ruby、Sinatra 和 ActiveRecord 之上。在发送响应之前会进行一些处理:

  • 首先传递内容ERB::Util.html_escape
  • 然后,通过应用一系列正则表达式str.gsub!(reg, " ### ")
  • 最后,通过返回响应MultiJson.encode

我不是 Ruby 人,但如有必要,可以提供更多详细信息。将不胜感激有人指出我正确的方向。谢谢!

4

2 回答 2

0

我们能够通过迁移到不同的 JSON 编码引擎来解决这个问题:

get "/foo" do
    resp = ""

    puts MultiJson.adapter()
    puts MultiJson.dump(resp) # Fails

    MultiJson.engine = :jrjackson
    puts MultiJson.adapter()
    puts MultiJson.dump(resp) # Succeeds
end
于 2013-11-01T02:35:32.930 回答
0

首先要检查的是角色是否以您认为的方式“进入”应用程序主体。Ruby 有一个默认的“内部”和“外部”编码的概念。一旦一个字符串通过各种 IO 进入,由于各种原因,它在传递时可能具有也可能没有预期的编码。

这并不是说它很难管理或令人困惑——这一切都非常简单,但我只是指出所有这些东西都可以配置/更改。

要查看您从什么开始,请尽快在程序中输入,然后检查其编码。

params[:foo].encoding
=> #<Encoding:UTF-8>

如果不是 utf-8,那么您需要设置您的环境和/或 IO 机制以使用 utf-8。

从 ruby​​ 2.0 开始,默认编码是--赞美大神--utf8。因此,如果您没有使用 ruby​​ 2.0 并且能够使用,请从升级到该版本开始。

如果您没有该选项,则需要设置默认编码。尽管似乎 sinatra 将其设置为 utf-8

于 2013-10-30T05:23:54.513 回答