うちのフレームワークの絵文字コンバータ機能を再作成しました。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で変換されているので。)
最近のコメント