Ruby 2.0中的二进制字符串文字

时间:2013-04-05 21:14:18

标签: ruby encoding

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

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

带有以下消息:

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

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

问题是从US-ASCII到UTF-8的源文件(以及字符串文字)changed in Ruby 2.0的默认编码。

1 个答案:

答案 0 :(得分:25)

解决方案是更改字符串文字的定义以强制执行其编码。有几种可能的选择:

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

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

使用String#b(仅限Ruby&gt; = 2.0):

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

使用String#force_encoding(仅限Ruby&gt; = 1.9):

expected = "\xD1\x9B\x86".force_encoding("ASCII-8BIT")