参考:Ruby2.0.0への移行について(文字列エンコード関連)
前項の続き。
1.8.7→1.9系移行でよく言われるエンコード関連は下記の通り。
(※各サイト固有の問題は割愛しています。)
Iconvは1.9以降はエラーとなる
Macユーザーの中で、よくYouTubeの動画名にFinderのファイル名をコピーする方がいらっしゃいますが、そうすると濁音・半濁音の表示がおかしくなることがあります(UTF-8-MAC問題)。
その回避にIconvを使っていましたが、1.9移行は非推奨となりますので、1.9系以降のしきたりに従うようにします。
require 'iconv' if RUBY_VERSION <= '1.8.7' begin if RUBY_VERSION <= '1.8.7' # 1.8.7 str = Iconv.iconv("UTF-8", "UTF-8-MAC", str).to_s else # 1.9系以降 str.encode!("UTF-8", "UTF-8-MAC", :invalid => :replace , :undef => :replace) end rescue Iconv::IllegalSequence => ex # ここは1.8.7しか発生しないはず 例外処理 rescue => ex 例外処理 end
「$KCODE = "u"」の扱い
Twitterには文字列制限がありますが、1.8.7では「$KCODE = "u"」を指定しないと正しい文字数をカウントしてくれません。
$KCODE = "u" if RUBY_VERSION <= '1.8.7' def char_count(str) if RUBY_VERSION <= '1.8.7' return str.chars.count # 1.8.7推奨 else return str.length # 1.9系以降推奨 end end
Mechanizeの「.page.body」はeconde(〜)と相性が悪いのでKconvを使用
下記コードは本来ならばencode!メソッドを使用しUTF-8化すべきかもしれませんが、テスト中にエンコードがうまくいかないサイトが頻発したため、従来のKconvに戻しました。
agent = Mechanize.new agent.get(url) body = Kconv.toutf8(agent.page.body)
SQLiteではStringのはずがBLOBやバイナリでinsertされるケースがある
原因までは究明しませんでしたが、SQLiteのあるテーブルのいくつかのカラムが何らかの条件により、BLOBやバイナリとしてInsretされる現象が発生しました。
あまり深く考えずに、下記の通り文字コード情報を指定してあげることにより回避。
hoge.force_encoding("UTF-8") unless RUBY_VERSION <= '1.8.7'
私はいくつかのSQLite用のユーティリティアプリ・プラグインを併用していますが。MesaSQLite(アプリケーション)では文字情報として自動的に変換され変更が可能ですが、SQLite Manager(Firefoxプラグイン)では文字列ではない形で表示されます。気になる方はテスト段階でSQLite Managerにて確認されることをお勧めします。