うちのフレームワークの絵文字コンバータ機能を再作成しました。3キャリアのSJISのページから送られてくる絵文字をmbstring.encoding_translationで、内部エンコードのUTF-8に変換したのちに、絵文字を [emoji:E123] のような内部で扱う形式に変換し、DBに保存する。PCサイトの出力時には、<img>で絵文字画像を出力し、各携帯キャリアに出力する際には、各キャリアの絵文字に変換して出力する機能です。

絵文字のバイナリと絵文字タグの相互変換をするための変換テーブルをどのような形式にしようかとだいぶ模索しました。

■フォームからやってくる絵文字を内部用の絵文字タグに変換する実装

DoCoMo

フォームからのSJIS絵文字=>UTF-8に変換=>※置換実行※<=UTF-8に変換<=unicodeの16進数をpack

EzWeb

フォームからのSJIS絵文字=>UTF-8に変換=>※置換実行※<=UTF-8に変換<=Shift-JISの16進数をpack

Softbank

フォームからのSJIS絵文字=>UTF-8に変換=>※置換実行※<=UTF-8に変換<=Shift-JISの16進数をpack

■内部用絵文字タグを絵文字に変換して携帯に出力する実装

DoCoMo

絵文字タグ=>※置換実行※<=UTF-8に変換<=unicodeの16進数をpack
※置換実行※=>SJIS-winに変換

EzWeb

絵文字タグ=>※置換実行※<=UTF-8に変換<=Shift-JISの16進数をpack
※置換実行※=>SJIS-winに変換

Softbank

絵文字タグ=>※置換実行※<=UTF-8に変換<=Shift-JISの16進数をpack
※置換実行※=>SJIS-winに変換

■実装する中でわかったこと

ドコモ絵文字は、mb_encoding_translationで、unicodeからSJIS-winや、UTF-8に変換して、それぞれの文字コードで表示できる。しかし、EzWebやSoftbankの絵文字では、unicodeから、SJIS-winや、UTF-8に変換しても、各エンコードの絵文字配列が異なるせいか、各エンコードで同じ絵文字を表示させることができない、というより文字化けとなる。したがって、サイトのHTML出力で使うエンコードの16進数を使ってバイナリを作り、それをmb_encoding_translationで変換してやる必要がある。(フォームからやってくる絵文字は、mbstring.encoding_translationで変換されているので。)