ホーム > perl > Encode::JP::Mobileにvodafoneの絵文字相互変換させるパッチ達

Encode::JP::Mobileにvodafoneの絵文字相互変換させるパッチ達

  • 投稿者: chiba
  • 2007/6/10 日曜日 12:54:57
  • perl

はぁー疲れた。
絵文字変換をUnicode::Japaneseをつかってやろうといろいろと試行錯誤してたのですがUnicode私用領域にマップするので4byte文字になってmysqlにbinary型にしないと格納できなかったり:”mysql 13823] MySQLの現行UTF-8の問題とその対処方法について”:http://www.mysql.gr.jp/mysqlml/mysql/msg/13823/ 、softbank(vodafone)のShift_JIS外字にマップされて送信されてくる絵文字:”3GC型端末の中には絵文字を違う形式で送ってくる端末がある(HTML編)”:http://labs.unoh.net/2006/10/softbank.html に対応してなかったりと苦労が多いので、どうせ苦労するならいっそのことと、カッとなってPerl的には由緒正しいであろうEncode::JP::Mobileで挑戦することにした。今は反省している。

Encode::JP::Mobile に i-mode と ezweb 間での絵文字相互変換をさせるパッチ
でi-mode< =>ezwebの相互変換が実装されて本体にもとりこまれてるようなので同じようにVodafoneのShift_JIS外字の絵文字でもやってみるかぁと思ったが結構めんどくさかったのでした・・・。というわけで以下作業メモです。

まぁまずは何はともあれucmファイルを作らないとだよね。ucmファイルって何なのかさっぱり分かってないけど。まぁ見よう見まね。ようはUnicodeと他の文字コードをマッピングするもんでしょ。

とりあえずEncode::JP::Mobileのshift_jis-imode.ucmを参考に。
ふむふむ。id:tokuhiromさんが作ってたのは

# below are KDDI => i-mode pictogram convert map.

この部分ね。

まぁとりあえずそれはおいといて純粋なucmファイルを作りましょう。
SoftBankの技術資料HTML編の211-222pにその対応表があるんだけど・・・げげっこれテキストコピーできないじゃん。そういう権限設定らしい。

と、ここで2時間ほどはまる。テキストコピーできる表がないかググってみたり、PDFを印刷してOCRにかけてみたり(いまいちな結果だった・・)。最終的にはxdoc2txtの-nオプションとやらで解決しましたが・・・いいんだろうか?

で、まぁできたファイルがこれ。
pre_shift_jis-vodafone-private.ucm
encodeing名はshift_jis-vodafone-privateにとりあえず決定。

さて、元となるucmファイルはできたので次は相互変換分のエントリを作るのですが、せっかくスクリプトを公開してくれていたので
前述のid:tokuhirom氏のrubyスクリプトを使わせてもらうことにする。なので同じように絵文字の相互変換リストSoftBank → i-mode, EZwebからとってくる。ただし、こいつの2番目の要素は”Webコードの一部”となっていて今回やりたいShift_JIS外字には適さないのでこれをi-modeやezwebと同じようにShift_JISのコードに変換したいんだけど、またこれがちと大変でした。
一応元にしたのは
SoftBank技術資料の絵文字一覧
と先ほどのPDF。PDFのほうにはウェブコードとやらは乗ってないのでUnicodeを経由してウェブコードをShift_JISに変換する。
んで、できたのがこれ。

emoji_v2ie_private.txt

v(odafone)だのs(oftbank)だのが入り混じっててややこしいですが、まぁ気にしないということで。

で、次はrubyスクリプトのほうに手をいれてみましょう。まぁこんな感じのパッチになりました。

--- make_convert.rb.org	2007-06-10 12:13:31.000000000 +0900
+++ make_convert.rb	2007-06-10 12:15:15.000000000 +0900
@@ -1,18 +1,20 @@
 ucm_for = {
     :i => 'ucm/shift_jis-imode.ucm',
     :e => 'ucm/shift_jis-kddi.ucm',
+    :v => 'ucm/shift_jis-vodafone-private.ucm',
 }   

 map_for = {
     :e => 'emoji_e2is.txt',
     :i => 'emoji_i2es.txt',
+    :v => 'emoji_v2ie_private.txt',
 }   

 uni2bytes = { :v => {}, :e => {}, :i => {}, :h => {} }
 bytes2uni = { :v => {}, :e => {}, :i => {}, :h => {} }
-no2byte   = { :e => {}, :i => {} }
-no2no     = { :e2i => {}, :i2e => {} }
-name_for  = { :i => 'DoCoMo pictogram', :e => 'KDDI/AU Pictogram' }
+no2byte   = { :e => {}, :i => {}, :v => {} }
+no2no     = { :e2i => {}, :e2v => {}, :i2e => {}, :i2v => {}, :v2i => {}, :v2e => {} }
+name_for  = { :i => 'DoCoMo pictogram', :e => 'KDDI/AU Pictogram', :v => 'Vodafone Pictogram' }   

 ucm_for.each {|carrier, fname|
     open(fname) {|io|
@@ -31,18 +33,26 @@
         io.readline   

         io.each {|line|
+            line.chomp!
             case carrier
             when :e
-                # EZwebネヨケ・Shift_JIS(web/hex)	i-mode	SoftBank
-                eno, byte, ino, sno =line.split(/t/)
+                # EZwebネヨケ・Shift_JIS(web/hex)	i-mode	Vodafone
+                eno, byte, ino, vno =line.split(/t/)
                 no2byte[eno] = byte.gsub(/(..)/) { "x#{$1}" }
                 no2no[:e2i][eno] = ino
+                no2no[:e2v][eno] = vno
             when :i
-                # i-modeネヨケ・Shift_JIS(hex)	EZweb	SoftBank	EZweb(web、ヌ、ホシォニーハムエケ)
-                ino, byte, eno, sno =line.split(/t/)
+                # i-modeネヨケ・Shift_JIS(hex)	EZweb	Vodafone	EZweb(web、ヌ、ホシォニーハムエケ)
+                ino, byte, eno, vno =line.split(/t/)
                 no2byte[ino] = byte.gsub(/(..)/) { "x#{$1}" }
                 no2no[:i2e][ino] = eno
+                no2no[:i2v][ino] = vno
             when :v
+                # Vodafoneネヨケ・Shift_JIS(hex)	i-mode  EZweb
+                vno, byte, ino, eno =line.split(/t/)
+                no2byte[vno] = byte.gsub(/(..)/) { "x#{$1}" }
+                no2no[:v2i][vno] = ino
+                no2no[:v2e][vno] = eno
             else
                 print "ORZ"
                 exit
@@ -59,6 +69,8 @@
         srccarrier = :i
     when 'e'
         srccarrier = :e
+    when 'v'
+        srccarrier = :v
     end   

     srccarrier = eval ":#{srccarrier}"

で、これを実行すると[iev]2[iev].txtが6個できるのでそのうちvに関係するものをEncode::JP::Mobileのucmファイルに突っ込む。
shift_jis-vodafone-private.ucmに関してはさっき作ったファイルに追記。
優先順位は基本i-modeを優先としてみた。

あとはテストを書いて、MakeFileに追記していつもの

perl Makefile.pl

make test

make install

して完了。

うまくいきました。

ちょっと気をよくしたので、ついでにshift_jis-vodafoneのほうにも手を加えて相互変換できるようにしてみました。
そんなわけで、Encode::JP::Mobile全体のパッチを以下においときます。

Encode-JP-Mobile.patch

ひとつ気になるのがここ。

+    $str = Encode::decode("shift_jis-vodafone-private", Encode::encode("shift_jis-vodafone-private", $str, $check), $check);

Encode::JP::Mobile::Vodafoneの変更はこんな感じでいいんかなぁ。
とりあえずテストは通ったからいいことにするけど・・・。
もっと良い方法あったら誰か教えてください。

というわけでおしまい。
これに絡むCatalyst回りの話なんかもあるんだけど・・・まぁまた今度時間があったら書きます。

追記
あっ、auとvodafone(softbank)はunicodeのマッピングが一部被ってた。
auを優先にしてみたけど・・・どうするのが正しいのだろうか・・・。

追記
Encode::JP::Mobile::Vodafone関連の不具合の修正パッチ

はてなブックマーク - Encode::JP::Mobileにvodafoneの絵文字相互変換させるパッチ達

コメント:0

コメントフォーム
入力した情報を記憶する

トラックバック:1

この記事のトラックバック URL
https://blog.everqueue.com/chiba/2007/06/10/10/trackback/
トラックバックの送信元リスト
Encode::JP::Mobileにvodafoneの絵文字相互変換させるパッチ達 - へぼい日記 より
pingback - 三茶から世界を目指す社長のブログ » geminium版 関ヶ原 より 2007/6/17 日曜日

[…] そんな中千葉の先週のエントリー これに膨大なgeekがアクセスして、ブックマークされ、 […]

ホーム > perl > Encode::JP::Mobileにvodafoneの絵文字相互変換させるパッチ達

検索
フィード
メタ情報

ページの上部に戻る