jpmobile, 日本語URI 問題

最近、仕事でRailsを使いプロトタイプを作っています。このサイトでは携帯からもアクセスされるので jpmoble を使っています。

jpmoble は、ちょっとした設定と携帯用テンプレートを用意するだけで、携帯サイトを作るさいに問題になるCookieが使えない、半角カナで表示したい、キャリア毎に違う絵文字・・・などなど をサポートしてくれる とても優れたプラグイン です。
id:darashi さんありがとうございます !! → http://d.hatena.ne.jp/darashi/searchdiary?word=%2a%5bjpmobile%5d

トラブル

昨日、ある機能を作っていたところ PC では動くのに、携帯では動かない部分が出てきてしまいました。
その機能は パラメター (URI) として日本語を渡しています。

Rails では

<%=link_to "Hoge", :action => "hoge", :id => "ア" %> 

のように書くと 日本語の部分は URLエンコードされ以下のようなリンクになります。URLエンコードUTF-8文字列としてエンコーディングされます。

http://server/controller/method/%E3%82%A2

PCではこの日本語パラメターは正しく解釈され動作しますが、携帯の場合は日本語が文字化けして正しく動作しない事が判りました。

なぜでしょう?

携帯は文字コードがShiftJISなのでjpmobileが日本語の文字コードをShiftJISに変更してくれます。また携帯から送られてきたShiftJISのパラメター等はUTF-8に変換されます。
日本語パラメターはUTF-8コードでURLエンコードされているので、そのままデコードし使えば問題が無いはずです。

しかし今回の現象は、以下のような流れで起きていました。

  1. URLエンコーディングのデコードは RailsのActiveControllerの中で比較的早いタイミングで行われる。
  2. jpmobileのShiftJIS→UTF-8変換は ApplicationControllerのbeforeフィルターとして動いている。
  3. この時点ではURLエンコードされた日本語はUTF-8の文字列になっている、しかしpmobileのShiftJIS→UTF-8変換が動作してしまい文字化けを起こす。
さて、とりあえずの対処ですが、

jpmobileは params ハッシュの中のデータをコード変換するので、ActiveControllerの持っている request.path_parameters ハッシュを参照することで対応できました。

    @key = request.path_parameters['id']      # 携帯で文字化けするので @key = params[:id]
根本的な解決はどうしたら良いのでしょうか?


などが考えられますが、どれが正しいのでしょうか?
検索系のアプリの場合どうしても日本語をパラメターで渡す必要があると思いますが・・・ 悩ましい問題です・・・・

参考資料: http://www.marguerite.jp/Nihongo/HowToMakeYourWeb/Columns/JapaneseURI.html