Ruby 2.0中的二进制字符串文字
升级到Ruby 2.0时,测试用例开始失败:
expected = "\xD1\x9B\x86" assert_equal expected, actual
以下消息:
expected but was .
actual
变量包含从外部库调用获得的二进制字符串。
问题是源文件的默认编码(以及字符串文字) 在Ruby 2.0中从US-ASCII更改为UTF-8。
解决方案是更改字符串文字的定义以强制执行其编码。 有几种可能的选择:
使用Array#pack (所有版本的Ruby):
expected = ["d19b86"].pack('H*')
使用字符串#b (Ruby> = 2.0):
expected = "\xD1\x9B\x86".b
使用String#force_encoding (Ruby> = 1.9):
expected = "\xD1\x9B\x86".force_encoding("ASCII-8BIT")