我们在一些较新的虚拟机上遇到了上述错误,而其他机器不受影响,想知道为什么以及如何摆脱它们。
两个主要区别如下
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 似乎是一种有效的解决方法。