Ruby 1.9.0でファイル先頭コメントからエンコーディングを抽出しそれをパーサで利用する

メモ。

http://d.hatena.ne.jp/macks/20071216#p1
http://d.hatena.ne.jp/Gimite/20080101/1199199332

などにもありますが、ファイル先頭のコメントの中でおまじないを書くとparserの文字コードが指定できます。

パーサの文字コードは、

  • ファイルをちゃんと読むためには文字コードがわからないと読めない
  • ファイルの文字コードがどうなっているかはファイルを読み込まないとわからない

というジレンマがある。ので、これを解決するために、先頭で文字コードを指定する技が作られた。

実際にやっているのはparse.yのset_file_encoding()。実際には、/coding(=|:)\s*[A-Za-z0-9_-]+/ みたいなパターンにマッチングさせてる感じ(たぶん不正確)。

呼び出しているのはparse.yの6028行あたりからはじまる case '#': のあたり。

得られた文字コード名を利用しているのはparser_set_encode()。encoding.cのrb_enc_find_index()を呼び出し、indexを取得できたらそれをparser->encにセットする。