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

rob*_*nst 12 ruby encoding

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

expected = "\xD1\x9B\x86"
assert_equal expected, actual
Run Code Online (Sandbox Code Playgroud)

以下消息:

<"?\x86"> expected but was
<"\xD1\x9B\x86">.
Run Code Online (Sandbox Code Playgroud)

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

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

rob*_*nst 26

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

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

expected = ["d19b86"].pack('H*')
Run Code Online (Sandbox Code Playgroud)

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

expected = "\xD1\x9B\x86".b
Run Code Online (Sandbox Code Playgroud)

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

expected = "\xD1\x9B\x86".force_encoding("ASCII-8BIT")
Run Code Online (Sandbox Code Playgroud)