uzullaの日記

本家:about等:Twitter
 | 

2008-03-19

rails+jpmobileで、PCで絵文字表示(三キャリア対応編)

| 13:32

Docomoの絵文字をPCで表示(拡張絵文字も追加)Docomo(imode)は対応してたんだけど、勢いでauezweb)とSoftbankMobile(ezsky、Y!)も対応してみた。これで一応3キャリア対応です。

まあ、auSBMはまだきっちりとはテストしてないですがね。


見ての通り、railsで、ヘルパー関数に登録して、Viewで使います。

module MypageHelper
  
  # htlmのエンティティを落としてから(railsのhelperのh())
  # emojichar>htmlimgtag convert Helper を実行
  # <%=h dirtytext %> みたいに
  # <%=he dirtytext_emojichar_conbined %> とかして使います。
  def he(str)
    str = emoji2imgtag( h(str) )
  end
  
  # emojichar>htmlimgtag convert Helper
  # Unicodeの絵文字を <img href='hoge'>に変換
  # jpmobileの出力するUnicode文字列に対応。
  # jpmobileの仕様上、SBMの文字空間は0x1000シフトされている
  # http://d.hatena.ne.jp/darashi/20070623
  # 
  # 3キャリア対応
  # Imode 基本絵文字+拡張絵文字に対応
  # AUの絵文字に対応(しかし未テスト)
  # SBMの絵文字に対応(しかし未テス(略
  def emoji2imgtag(str)

    if request.mobile?
      #相手が携帯電話なら処理しない(キャリア間の変換はjpmobileに処理を全部任せる)
      return str
    else
      chars = []
      chars = str.split('')
      returnstr = ''
      chars.each{ |char|

        n = char.unpack('U')[0] #数値に変換

        # FIXME 高速化のメモ
        # ↓おおまかな絵文字コードの範囲「以外」だったら処理しない様にすることで、
        # if文を大幅にやり過ごすことができる、はず。
        # ただ、見にくくなるのがイヤなので、高速化しなければならない時点まで放置。
        
        if ( 0xE63E <= n && n <= 0xE6A5 ) || # Docomoに対応
          ( 0xE6AC <= n && n <= 0xE6AE ) ||
            ( 0xE6B1 <= n && n <= 0xE6B3 ) ||
            ( 0xE6B7 <= n && n <= 0xE6BA ) ||
            ( 0xE6CE <= n && n <= 0xE70B ) || # ここまでimode 基本絵文字 範囲
          ( 0xE70C <= n && n <= 0xE757 ) # 拡張絵文字
          
          returnstr += '<img src="/images/e/i/' + char.unpack('U').to_s + '.gif" width="12" height="12" alt="' + char.to_s + '" >'
          
        elsif ( 58472 <= n && n <= 58847 ) || #au に対応
          ( 60032 <= n && n <= 60269 ) 
          
          returnstr += '<img src="/images/e/a/' + char.unpack('U').to_s + '.gif" width="12" height="12" alt="' + char.to_s + '" >'
          
        elsif ( 61441 <= n && n <= 61530 ) || #SBM に対応
          ( 61697 <= n && n <= 61786 ) ||
            ( 61953 <= n && n <= 62035 ) ||
            ( 61957 <= n && n <= 62039 ) ||
            ( 62209 <= n && n <= 62285 ) ||
            ( 62465 <= n && n <= 62540 ) ||
            ( 62721 <= n && n <= 62775 )
          
          returnstr += '<img src="/images/e/s/' + char.unpack('U').to_s + '.gif" width="12" height="12" alt="' + char.to_s + '" >'
          
        else
          #puts NKF::nkf('-U -s', "\ne:" + char.to_s)
          returnstr += char.to_s
        end
      
      }
      return returnstr
    end

  end
end

これで使う画像ファイルは、MobilePictogramConverterに添付されているものを変換して作りました。

ライセンスとかは考えたくないので(俺は趣味で使うからイイとして)、同様の事をしたければ自分でファイルを取ってきて、自分でライセンスを判断してください(SBMは必ず申請が必要な様です、詳しくは配布サイトを見てください)。


変換(というかリネーム)するバッチと、一番作るのがめんどくさかった文字コード空間のエクセル*1は、こちらにおいておきます。一昨日くらいの俺ならのどから手がでるほど欲しいファイルでした。

http://cfe.jp/pub/http_born1981.g.hatena.ne.jp_uzulla_20080319.zip

移動させる可能性大なので、直リンクはしないでください(このエントリに張ってくれれば、対応しておきます)。


上のSnippetにも書いてありますが、jpmobileの仕様上、SBMの絵文字空間は0x1000シフトされています。

しかし、上の私の作ったエクセル+バッチファイルでは、エクセルSBMの絵文字空間を正しく(資料通り)記述してありますので、そのままつかってはいけません。エクセルの絵文字空間を利用して、コードの条件文などを書く場合には注意してくださいね。

(って俺が書いてもしかたないので、本家情報を見てください。

バッチファイルはシフト済(0xExxx>0xFxxx)です。


本家でもこういうチケットがあるので、そのうち対応されるのでしょう。

そうなったらこれらは不要になりますね。


やっぱりちょと余る…

MobilePictogramConverter添付の画像から変換していくと、画像ファイルが変換しきれずに余るんですよね…、どうやら各社「資料にのってない絵文字」ってのがあるんですね、どないせえと(;´Д`)

まあ、チケットぴあの「ぴ」マークとか、Jskyのロゴとか、あんまり変換する意味のなさそうな(変換してもだれもよろこばなそうな)物ばっかりなんですけどね。

*1SJIS?のコードがファイル名になっているMobilePictogramConverterに添付画像から、扱いやすいUnicodeのコードへの対応表

KeyaanKeyaan2012/01/06 15:51A ltilte rationality lifts the quality of the debate here. Thanks for contributing!

 |