携帯の絵文字でgdgd
携帯用のコードを書いてたら、既存の静的コンテンツや設定ファイルに、3キャリア分の絵文字が併記されていた。sjis上では重複しないから1ファイル中に書いても問題はないらしい。
実際には、
- sjisコード上ではsoftbankの裏マッピングが他の絵文字と衝突するが、softbankの裏マッピングは表に変換できるので、そうすれば3キャリア分の絵文字を並存させることができる。
- unicode上ではkddiの仕様とsoftbankの仕様が衝突するが、kddiにはunicodeの裏マッピングがあるので、それを使えば3キャリア分の絵文字を並存させることができる。
どちらでも並存自体はできるのだが、だからといって設定ファイルや静的コンテンツをunicodeにしてしまうと、kddiの裏マッピングを作業者に説明しないといけなくなってしまう。仕様も公表されてない裏マッピングについて説明しても理解や賛同を得られないだろうし、運用的にはこの設定ファイルはsjisでないとありえないのだろう。sjisであれば、各キャリアが公表してる仕様どおりのコードを書いてもらえばすむ話である。
というわけでそれをデコードするエンコーディングが…見当たらなかった。やれやれ、「3キャリア分の絵文字が併記されたcp932」をデコードするエンコーディングモジュールをperlで書くことになるのか…。正規化はまったく行わず、unicode上でも3キャリア分の絵文字が並存する感じの方が扱いやすそうだ。
ez携帯上でsjisのimode絵文字をそのまま表示した場合と、Encode::JP::Mobileを使ってsjisのez絵文字にマッピングした場合とでは、違う絵文字が表示されることがあった。何をもって意図どおりとするかにもよるけど、この場合は余計なマッピングテーブルを介さない方が調整はやりやすいかもしれない。
Encode::JP::Mobileではサーバ側は基本的にutf8のデータしか持たないという前提で作られているようで、サーバ側にsjisで書かれたリソースがあって、1ファイルに複数キャリアの絵文字が入っているというような事態はサポートしていないらしい。utf8での特定キャリアに合わせた正規化を行うエンコーディングは充実しているんだけどな。