絵文字変換プログラムが形になる
年が明けてからブログの更新が滞りがちでしたが、ずっと携帯サイトの絵文字変換プログラムの作成にかかりきりでした。とりあえず、DoCoMo、au、SoftBank(3G機種除く)の絵文字が入力されたら独自タグに変換して保存し、それを出力する際には機種ごとのバイナリコードに再変換する、というプログラムが出来上がりました。めちゃくちゃ疲れました。
DoCoMoとauの絵文字に関してはいずれも2バイトのShift_JISバイナリコードでフォームから飛んでくるので、それを正規表現で検出してunpack関数で4ケタの数値に変換し、DoCoMoなら{d:xxxx}、auなら{a:xxxx}というように独自タグに変換しました。ここはサラリといきました。
SoftBankはくせものでした。「”」や「&」などのエスケープ対象文字を含む5バイト文字が送出される2G機種、他機種と重複する外字領域を使用した2バイトのShift_JISバイナリコードが送出される3G機種のSHシリーズ、そもそも文字コードがUTF-8でないと絵文字が送出されないその他の3G機種など、機種によって違いがありすぎて対応に四苦八苦しました。
とりあえず手持ちの3G機種でUTF-8のページから絵文字を送信し、UTF-8コードを取得するのには成功しましたが、今ある携帯サイトのプログラムをUTF-8ベースに修正するのにはかなり手間がかかりそうだったので、とりあえずShift_JISベースのままで対応できる2G機種と3G機種のSHシリーズにのみ対応することにしました。
それぞれの絵文字コードに応じて2通りの正規表現を用意しましたが、特に2G機種の絵文字コードが何かと面倒な仕様になっていて大変でした。絵文字が連続すると1・2・3・5バイト目が省略されることがあったり、絵文字が文末にあると5バイト目が省略されることがあったり……。う〜ん、マニアック。覚えたての正規表現を駆使して何とか対応しました。
こんな感じで3機種の絵文字を独自タグに変換したら、同一機種であればそこから4ケタの数値を取り出してpack関数で元のバイナリコードに戻すだけで表示できるようになりました。ただし、SoftBankの2G機種だけは細かいゴニョゴニョが必要になりましたが。
他機種向けには独自コードをそれぞれの機種向けのバイナリコードにひとつずつ置換するわけですが、共通する絵文字が150くらいあったのでコーディングするだけでも一苦労でした。共通しない絵文字は適当な文字に変換しておくことにしました。
そんなこんなでプログラムを動かしてみると、ちゃんと入力された絵文字が独自タグに変換されていて、出力時には絵文字に変換されていたので、ちょっと感動してしまいました。やればできるもんですね。それにしても、携帯サイトなんて簡単に作れるとたかをくくっていましたが、そうでもありませんでした。キャリアごとの独自仕様に付き合いだすと実に大変です。