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メソッドを利用する。