rspec控制器响应中的“UTF-8中的无效字节序列”

时间:2013-10-10 17:07:11

标签: ruby ruby-on-rails-3 rspec

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

两个主要区别如下

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似乎是一种有效的解决方法。

1 个答案:

答案 0 :(得分:0)

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

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

完全救了我。本质上,它涉及将您的UTF-8编码转换为UTF-16,然后将其编码回UTF-8。有关详细信息,请here