Ruby 1.8から1.9へ
今更なことですが、Rubyの最新バージョンは1.9です。
僕が使っているのは1.8です。これはMacに入っている標準のバージョンが1.8だからです。
しかし、使っているのが1.8だからと言って、1.8がいつまでも使える環境にあるか否かと考えてみると、きっといつの日か使えない日が来るでしょう。
その時に困らないようにと、別に持っているUbuntuマシンに1.9を入れて、自分のスクリプトが動作するかどうか試してみました。
結果は、全敗。
いろいろと調査していたのですが、既に数千から数万行あるスクリプトの調査に疲れ、先日まで投げ出していました。
ところが、先日、新しく1.9の環境で一から作り始めてみると簡単に原因がわかってしまいました。改めて調べてみるとWeb上にも似たような事例が沢山あり、前回の調査でどうして解決できなかったのか、自分でもわかりません。
では、僕のスクリプトが動作しなかった原因と、その解決策を以下にまとめます。
1. 原因
データベースにSQLite3を使用しているのですが、SQLite3/Rubyは1.9において戻り値のエンコーディングをASCII-8BITで返していた。
WebアプリケーションではUTF-8を標準で使用し、データベースに登録するときはUTF-8で保存していたので、SQLite3からの戻り値と他のデータをgusbで置き換えようとしたときに、エンコーディングが不一致であるとのエラーが出る。
同じく、GETで取得したデータもASCII-8BITとなっていた。
2. 対策
RUBY_VERSIONによりバージョン情報を取得して、1.9以上であればforce_encoding('UTF-8')で強制的にUTF-8に変換する。
if RUBY_VERSION < '1.9.0' then
tmp = val.to_s
else
tmp = val.to_s.force_encoding('UTF-8')
end
関数でも作って、これを中継して文字列処理を行うようにすれば良いみたい。
良かった、良かった。これで、大量に作ったWebアプリを移行する作業に目処がつきました。
| 固定リンク
コメント