この記事はアピリッツの技術ブログ「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つ。
- config/environment.rbにマジックコメントを追加する(参考:Ruby 1.9リファレンスのマジックコメントの説明)
- config/boot.rbの該当の例外が出る直前に「Encoding.default_external = ‘UTF-8’」を記述する
結果から言うと、1は駄目で2はできました。マジックコメントにはまだ理解が足らないようです。
ということで、2の方法を採用します。プロジェクト全体で同じ問題が発生しそうなので、記述はファイルの先頭に挿入しました。同じような現象が出た場合に参考にしていただけると幸いです。
今回調べてわかりましたが、Rubyは1.9になって、多言語化対応で、色々と手が入っているようです。それで便利になる反面、今回のように1.8で動いていたものについては、例外が発生するようになってしまうこともあるようです。1.8から移行する場合はこの辺も気をつけておいた方がいいようです。