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さん
半角カナを扱うように変更しました。
ありがとうございます。

9 comments:

TAKAI said...

SoftbankにはMOTから始まるユーザエージェントを送ってくる端末があるそうですので、

Index: lib/mobile_controller.rb
===================================================================
--- lib/mobile_controller.rb (revision 7)
+++ lib/mobile_controller.rb (working copy)
@@ -9,7 +9,7 @@

# User Agent for mobile
UA_DOCOMO = /^DoCoMo/.freeze
- UA_SOFTBANK = /^(SoftBank|Vodafone|Browser|J\-PHONE|Vemulator)/.freeze
+ UA_SOFTBANK = /^(SoftBank|Vodafone|Browser|J\-PHONE|Vemulator|MOT)/.freeze
UA_AU = /^(UP\.Browser|KDDI)/.freeze
UA_AU_HTML = /^(KDDI)/.freeze

takeru said...

before_filterでの絵文字変換がされないみたいなのですが、

include ::ActionController::Mobile
を自分のコントローラに書き込んだら変換されました。

apache ProxyPass + mongrel + rails 1.2.2です。

takeru said...

ちょっとなおしたら動き出しました。

http://d.hatena.ne.jp/urekat/20070315/1173926636

rakuto said...

takeruさんありがとうございます。
変更を反映しました。

takeru said...

auのユーザエージェント判定の正規表現がUP.Browserをみていますが、VodafoneにUP.BrowserというUserAgentを投げてくる端末があります。KDDIでみるようにするか、Vodafoneを先にマッチングするようにする必要があるとおもいます。また、SBはHTTP_X_JPHONE_UIDをIDとして使った方がよいと聞いたことがあります。

kaz said...

こんにちは、便利に使わせてもらっています。ありがとうございます。

さて、DocomoのN700iでフォームからデータを送信する際に、うまくセッションが特定できない現象が出ています。auのw41caでは問題なく動いています。

少し調べたところフォームのURLとフォーム内のパラメータにセッションIDが重複して存在するとうまく動作しないとの報告がありました。

http://sai10sight.typepad.jp/sai10sight/2006/11/mobile_view_1fa2.html

もしかしたら同じ現象ではないかと思い投稿しました。

もし可能であれば調査していただけると助かります。


以上、よろしくお願いします。

Masudaq said...

こんにちは、本番環境で「Mobile on Rails」使用させてもらっているMasudaqと申します。

とても便利で助かってますが、一つだけ拡張したい要件があります。

絵文字をPC版で画像として表示させる為には、どこをどのようにいじるのが適切でしょうか?

お手数ですが、ご教示頂けると幸です。

以上、宜しくお願いします。

rakuto said...

コメントありがとうございます。Bloggerの不具合なのかコメント時にメールが送られず、コメントに気づきませんでした。すみません。別エントリにて回答します。

sasaki said...

redirect_to を行う時にセッションIDが引き渡されない不具合があったのと、DoCoMoにてCSSが反映されないためレスポンスヘッダーを修正しました。
これらソースをお送りすればコミットしていただくことは可能でしょうか?