1

我们在一些较新的虚拟机上遇到了上述错误,而其他机器不受影响,想知道为什么以及如何摆脱它们。

两个主要区别如下

vm_old:
debian squeeze
ruby1.9.2p0

vm_new:
debian wheezy
ruby1.9.2p320 (over rvm)

虚拟机中自然会有更多变化,但我不知道哪些会影响这种行为。

我们的一些控制器中有一个包含变音符号的响应(即'{“message”:“ü”}'),我们已经设置# encoding: utf-8

在规范中,我们使用这个变音符号测试针对固定字符串的响应

it 'should test something' do
  get :some_controller, format: :json

  response.status.should == 200
  json = ActiveSupport::JSON.decode(response.body)
  json["message"].should == 'ü' # breaks on this line

  # ... some more tests

end

ü 的替代品似乎是一个随机的 4 位字符串。有时这个字符串似乎是有效的 utf-8 并且可以传输。然后我们有一个失败的规范而不是标题中的错误消息,因为随机字符串与 ü 不同。

规范文件本身也有# encoding: utf-8第一行。我们尝试使用语言环境或使用force_encoding('utf-8')

现在的问题变成了:有其他人遇到过这样的问题吗?以及如何解决?

编辑:原来它并不总是以P\.

编辑 2:测试表明这是 json 解码的问题。控制器响应类似于"{\"foo\": \"\u00fc\"}",解码导致随机输出序列\u00fc曾经是。

对于简单的复制:

bundle exec rails c
> ActiveSupport::JSON.decode(ActiveSupport::JSON.encode({:foo => "ü"})

轨道版本是 3.0.4

编辑 3:将 JSON 后端更改为 Yaml 似乎是一种有效的解决方法。

4

1 回答 1

1

我不确定这是否对你有帮助,但我想我会把它扔在那里。对我来说,添加以下代码:

.encode('UTF-16le', :invalid => :replace, :replace => '').encode('UTF-8')

完全救了我。本质上,它涉及将您的 UTF-8 编码转换为 UTF-16,然后将其编码回 UTF-8。更多信息可在此处获得。

于 2013-10-11T02:10:47.603 回答