RubyでString.newデビューした
it { expect([255].pack("v")).to eq "\xFF\x00" }
Failure/Error: it { expect([255].pack("v")).to eq "\xFF\x00" } expected: "\xFF\u0000" got: "\xFF\x00" (compared using ==)
環境
- Ruby 2.6.1
なにが起こった?
- Rubyでは文字列比較の際、エンコーディングも比較する。
- 文字列リテラルのエンコーディングは、スクリプトエンコーディングになる。
- デフォルトのスクリプトエンコーディングは、UTF-8である。
- Rubyではバイト列もStringとして表され、エンコーディングはASCII-8BITである。
すなわち、
> "\xFF\x00".encoding => #<Encoding:UTF-8> > [255].pack("v").encoding => #<Encoding:ASCII-8BIT>
対策
期待値の文字列のエンコーディングをASCII-8BITを指定できれば良い。 String.newによってエンコーディングが可能。エンコーディング指定による変換も行われない。
> String.new("\xFF\x00", encoding: "ASCII-8BIT").encoding => #<Encoding:ASCII-8BIT>
参考
追記
String#bの方が便利かもしれません。