我们在一些较新的虚拟机上遇到上述错误,而其他机器仍未受影响,并想知道为什么以及如何摆脱它们。
两个主要区别如下
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 => "ü"})
rails版本是3.0.4
编辑3 : 将JSON后端更改为Yaml似乎是一种有效的解决方法。
答案 0 :(得分:0)
我不确定这对你有帮助,但我想我会把它丢在那里。对我来说,添加以下代码:
.encode('UTF-16le', :invalid => :replace, :replace => '').encode('UTF-8')
完全救了我。本质上,它涉及将您的UTF-8编码转换为UTF-16,然后将其编码回UTF-8。有关详细信息,请here。