ホーム DoRuby Rubyを1.9にするとrakeコマンドで例外が発生する問題とその対処法

Rubyを1.9にするとrakeコマンドで例外が発生する問題とその対処法

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

 こんにちは。

 KBMJでRuby on Rails を使ったweb開発に携わっているyoppiといいます。

 今回はRuby1.8で動いていたRailsのプロジェクトをRuby1.9にした時に出た問題とその対処法について書こうと思います。

 まず、今回の現象が出た時の環境を書いておきます。

 OS: Windows Vista Home Basic SP1

 Ruby:1.9.1

 Rails:2.3.2

 rake:0.8.4

 問題は、ruby1.9にしてプロジェクトのルートディレクトリでrakeコマンドを実行したときに起きました。

 rakeコマンドの引数が何であっても、「invalid byte sequence in Windows-31J」という例外が発生します。調べてみるとどうやらconfig/boot.rbの「 File.read(“#{RAILS_ROOT}/config/environment.rb”)」(Railsのバージョンによっては、IO.read・・・になってたりします)で発生していたようです。

 config/environment.rbは、UTF-8なのですが、Windows-31Jとして読み込もうとして、文字コード関連の例外が発生しまっているみたいですね。

 例外の原因はファイルの文字コードの扱いがRubyの1.8と1.9で変わったということのようです。

 Ruby 1.9 m17n リファレンス (不完全版) – diary of a madman

 「Ruby 1.9 文字コード」で検索して、上記サイトを発見しました。どうやら、OSの標準の文字コード以外をファイルの読み書きに使う場合、明示的に指定する必要がありそうです。

 やり方として思いついたのは2つ。

  1. config/environment.rbにマジックコメントを追加する(参考:Ruby 1.9リファレンスのマジックコメントの説明)
  2. config/boot.rbの該当の例外が出る直前に「Encoding.default_external = ‘UTF-8’」を記述する

 結果から言うと、1は駄目で2はできました。マジックコメントにはまだ理解が足らないようです。

 ということで、2の方法を採用します。プロジェクト全体で同じ問題が発生しそうなので、記述はファイルの先頭に挿入しました。同じような現象が出た場合に参考にしていただけると幸いです。

 今回調べてわかりましたが、Rubyは1.9になって、多言語化対応で、色々と手が入っているようです。それで便利になる反面、今回のように1.8で動いていたものについては、例外が発生するようになってしまうこともあるようです。1.8から移行する場合はこの辺も気をつけておいた方がいいようです。

記事を共有
モバイルバージョンを終了