RUBYOPTを使った外部エンコーディングの指定

今年からSassでcontentプロパティーなどでマルチバイトの文字列をエスケープせずにばしばし書くことにしたので、遂にWindowsでもUTF-8をデフォルトにしないとダメそうな感じになった。この場合、環境変数LANGを変えようとか良く書かれているけれど、Ruby以外に影響を及ぼさない真っ当な手段としてはRUBYOPTの方を使うべきなようだ。

特に設定していないとマルチバイト文字列を含むSassファイルをコンパイルしようとすると以下のようなエラーメッセージを吐いて落ちる。

C:\>scss test.scss
Error: Invalid Windows-31J character "\xE2"
        on line 2 of test.scss
  Use --trace for backtrace.

test.scssの2行目にはが含まれている。このファイルに@charset "UTF-8";を追加することでも正常にコンパイルされるようになるが、Sass(やRuby)はUTF-8で書くので、ユーザーワイドに設定してやった方が省力化を図れる。

C:\>set RUBYOPT=--encoding=UTF-8

C:\>scss test.scss
@charset "UTF-8";
.test {
  content: '➔'; }

RUBYOPT環境変数で--encodingオプションを指定してやることで、外部エンコーディングをUTF-8に強制すると動くようになる。動作が確認できたら、あとはシステムのプロパティーからユーザー環境変数に仕込んでやれば良い。

システムのプロパティーのダイアログよりユーザー環境変数へRUBYOPTを追加している様子
ユーザー環境変数の設定ダイアログ

なお、今のSassは非ASCII文字列があると、適切な値の@charsetディレクティブを必ず追加するようになっている。先頭の@charset "UTF-8";を削除したい場合は何かしら別のツールに頼る必要がある。


マルチバイト文字列をそのまま書くことにしたのにはいくつか理由があるが、一番大きいのはエスケープされた文字列は人間が書くべきものではないということだ。\0020とか書いているとバカバカしくなる。それ以外にももちろんわかりやすくなることとか、わざわざコメントでどういう文字のエスケープなのかとか書かなくて済むこととか。ただし見てもなにかわからない非改行スペースのようなものだけはエスケープする、というルールにした。