2007.03.02

Ruby Rails

Railsでの携帯サイト作成時の文字コード変換(@paramsとrequest.body)

現在JpmobileMobile on Railsを使って携帯サイト構築の勉強中。
で、携帯はShift_JISの世界で、RailsはUTF-8の世界なので、文字コード変換が必要になったので勉強した。

Rubyの文字コード変換には、KconvNKFというのがあるらしい。
Kconvは文字コードを自動判定してくれるらしいが、自動でいろいろやる部分が逆に失敗したりするらしいので、文字コードが分かってるときにはNKFを使う方が良い。

ということで、Jpmobileのページにあるto_sjisメソッドはKconvを使ってるが、こいつをNKFを使うように変更した。

$RAILS_ROOT/app/controllers/application_controller.rb内に以下のメソッドを定義すれば良い。
これで、携帯から送られて来た全フォームのパラメータがUTF-8に変換され、携帯へのHTML表示時にすべての(UTF-8エンコーディングされた)文字がShift_JISに変換される。

class ApplicationController < ActionController::Base
  before_filter :params_encode_convert
  after_filter :response_encode_convert
  
  private
  def response_encode_convert
    if is_mobile?
      # UTF-8 to Shift_JIS
      response.body = _convert_charset(response.body, '-Ws')
      headers["Content-Type"] = "text/html; charset=Shift_JIS"
    end
  end
  
  def params_encode_convert
    if is_mobile?
      # Shift_JIS to UTF-8
      # '@' is necessary in '@params'.
      # Don't use 'params'
      @params = _convert_charset(@params, '-Sw')
    end
  end
  
  def _convert_charset(data, nkf_opt='')
    if data.is_a?(String)
      return NKF.nkf('-m0 -x '+nkf_opt, data)
    elsif String(data.class) == "NilClass"
      return nil
    elsif data.is_a?(Hash)
      data.each do |key,val|
        data[key] = _convert_charset(val, nkf_opt)
      end
      return data
    else
      return data
    end
  end
  
  def is_mobile?
    request.mobile?
  end
end


追記:Jpmobileにこれらのフィルタが実装されました。
dara日記 - Shift_JISと半角文字のフィルタを実装しました