14

升级到 Ruby 2.0 时,一个测试用例开始失败:

expected = "\xD1\x9B\x86"
assert_equal expected, actual

带有以下消息:

<"ћ\x86"> expected but was
<"\xD1\x9B\x86">.

actual变量包含从外部库调用获得的二进制字符串。

问题是源文件的默认编码(以及字符串文字)在 Ruby 2.0中从 US-ASCII 更改为 UTF-8。

4

1 回答 1

30

解决方案是更改字符串文字的定义以强制其编码。有几个可能的选项可以做到这一点:

使用Array#pack(所有版本的 Ruby):

expected = ["d19b86"].pack('H*')

使用String#b(仅限 Ruby >= 2.0):

expected = "\xD1\x9B\x86".b

使用String#force_encoding(仅限 Ruby >= 1.9):

expected = "\xD1\x9B\x86".force_encoding("ASCII-8BIT")
于 2013-04-05T21:14:18.047 回答