RSpecでWindows-31Jの文字コードを使うときのメモ

RSpecで Windows-31Jのエンコードを扱うときにハマったので、作業メモ。

Rubyファイルのエンコードについて

Rubyでは、ファイルのエンコードを判定するために、 ファイル冒頭のマジックコメントを利用している。


UTF-8の場合
# coding: utf-8

Windows-31Jの場合

coding: Windows-31J


エンコードのことなる関係でRubyを利用するときは注意が必要。


Rubyでは、文字列のエンコードを変換するために、以下のメソッドがある。


戻り値として変更

str.encode!(“UTF-8”)

上書き変更

str.encode!(“UTF-8”)

エンコードを調べる

str.encoding

RSpecでのエンコード

RSpecで文字列を比較するときは、当然文字コードが期待値と結果で同一な必要がある。

specファイルもテスト対象も同一の文字コードで記述すれば比較は問題ない。

しかし、普段Emacsに結果を表示していて、その表示がUTF-8でないと文字化けしてしまう。

しかたがないので、以下のようにした。

  • specファイルは UTF-8
  • テスト対象ファイルは Windows-31J
  • specからテスト対象を呼び出すときと、結果の比較で encodeメソッドを利用する。
it "日本語" do
  line = "SCENARIO_NAME = \'こんにちは\'".encode!("Windows-31J")
  @perser.parse(line, @regexp).should == "こんにちは".encode!("Windows-31J")
end