今年から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に強制すると動くようになる。動作が確認できたら、あとはシステムのプロパティーからユーザー環境変数に仕込んでやれば良い。
なお、今のSassは非ASCII文字列があると、適切な値の@charset
ディレクティブを必ず追加するようになっている。先頭の@charset "UTF-8";
を削除したい場合は何かしら別のツールに頼る必要がある。
マルチバイト文字列をそのまま書くことにしたのにはいくつか理由があるが、一番大きいのはエスケープされた文字列は人間が書くべきものではないということだ。\0020
とか書いているとバカバカしくなる。それ以外にももちろんわかりやすくなることとか、わざわざコメントでどういう文字のエスケープなのかとか書かなくて済むこととか。ただし見てもなにかわからない非改行スペースのようなものだけはエスケープする、というルールにした。