その他
    ホーム 技術発信 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から移行する場合はこの辺も気をつけておいた方がいいようです。

    記事を共有