l'essentiel est invisible pour les yeux

Tuesday, February 06, 2007

[Rails] 絵文字変換などの携帯サイト開発をサポートするMobile on Railsを作った

卒論を書いていたため、久々の技術ネタです。
携帯サイトの開発をサポートするプラグインを作りました。

Mobile on Rails

API ドキュメント

インストール方法
レポジトリをRuby forgeに移しました。


% ./script/plugin install http://mor.rubyforge.org/svn/trunk


更新履歴
以下のパッチを適用しました。ありがとうございます。
Mobile on Rails をSoftBank のあれな絵文字仕様に対応させた

主な機能は次の通り。
  • キャリア間の絵文字の変換メソッド
  • キャリア内での絵文字表記の変換
  • ユーザエージェントに応じて絵文字を変換
  • 携帯サイト開発のための便利なメソッド
  • フォームからの入力を内部エンコーディング(可読文字列)に変換する
  • セッションIDをURLに付加
  • 携帯からのリクエストの際は携帯用のViewを読み込む
  • リクエストとレスポンスをSJIS<->UTF-8に相互変換
  • 対応キャリアは、DoCoMo, au, SoftBank, WILLCOM
View中でDoCoMoのUnicode表記(&#xXXXX;)で絵文字を記載するだけでキャリアに応じた適切な絵文字に変換して絵文字をSJISバイナリで出力します。

フォームからの入力に関しては、絵文字をSJISバイナリから内部エンコーディングに変換してから、UTF-8に変換します。内部エンコーディングは出力時に自動的に適切な絵文字に変換されるため通常の文字列と同じように扱えます。

設定は不要です。

内部エンコーディング規則は次の通りです。
DoCoMo "\xf8\xf9" => __D_F8F9__
AU \xf6\x60 => __AU_F660__
SoftBank \x1b$Gj\x0f => __SB_$Gj__
SoftBank \x1b$Gji\x0f => __SB_$Gj____SB_$Fi__


携帯用にViewを切り替えるライブラリであるRailsで携帯用にビューを切り替えを参考に拡張させていただきました。

設定が不要な代わりに、次のような制約を設けています。
・携帯用Viewを#{RAILS_ROOT}/app/views_mobile/以下に設置する
・View中で絵文字はDoCoMoのUnicode表記で記載する

lib/init.rb中の次の二行をコメントアウトすれば絵文字変換に関するモジュールのみ利用できます。

require 'mobile_controller'
require 'mobile_view'


絵文字変換

手抜きで申し訳ないのですが、ユニットテストを参照してください。

emoji_test.rb

変換されない絵文字はゲタ文字に変換されます。キャリア間の絵文字変換を追加する場合は、tool/emoji_map.datに追加します。絵文字の順序は一行目のコメントに書いている通りです。

次の手順で絵文字変換表を作成し配置します。

% cd vendor/plugins/mobile_on_rails/
% rake updatedat




リクエストオブジェクトの拡張
次の二つのメソッドを追加
http://shindaita.stiq.net/rdoc/mobile_on_rails/classes/ActionController/AbstractRequest.html

・サブスクライバIDの取得
・携帯からのリクエストかどうかの判定
request.mobile? #=> true or false
request.subscriber_id #=> Ex) 000000000000000
request.subscriber_id(true) #=> Ex) ゲートウェイのIPをチェック

ライセンスはMITライセンスです。改変は自由です。

キャリア間の絵文字変換のルールについては、次のサイトで定められている"ような"ルールに従います。
http://www.nttdocomo.co.jp/service/imode/mail/imode_mail/emoji_convert/
http://elixir.neu.co.jp/user/technical/convert1_1.html


追記
via Takaiさんに頂いたコメント
"MOT"を含むユーザエージェントをSoftBank携帯からのリクエストと判別するようにしました。
ありがとうございます。

via babieさん
半角カナを扱うように変更しました。
ありがとうございます。