参考: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にて確認されることをお勧めします。