こんにちは。tommy です。どういうわけか名前だけは時々出ていたと思うのですが、自分でエントリを書くのは初めてです。よろしくお願いします。
さて、DECOLOG では、ユーザーが投稿したテキストに含まれる絵文字を各キャリアに合わせて適宜変換して表示しています。携帯サイトでは当たり前にやっていることではありますが、DECOLOG の場合はそれに加えて携帯-スマートフォン間についても相互変換を実現しています。ここではそれをどのように実現しているかを 2 回に分けて解説していきたいと思います。
まず今回は、現状のスマートフォンのブラウザがどのように絵文字を扱っているのかを整理し、次回それに対して実際にどのような仕組みで対応しているかを説明したいと思います。
1. 携帯絵文字の仕様のおさらい
古き良き(?)携帯の絵文字の仕様については既に解説が既に多くありますので詳細は省略します。(きちんとした用語を使って)解説しているページとして、以下を挙げておきます。
http://coderepos.org/share/wiki/Mobile/Encoding
なお、スマートフォン上の絵文字の仕様を理解する上で必要となる知識は、
- Shift JIS の空き領域 (85区〜120区) に絵文字が配置されている。具体的な位置 (コードポイント) はキャリアによって異なる。
DoCoMo | 112区〜114区 |
au | 101区〜103区
107区〜110区 |
SoftBank | 109区〜110区
113区〜114区
117区〜118区 |
例えば「晴れ」の絵文字は、DoCoMo: 0xF89F
, au: 0xF660
, SoftBank: 0xF98B
となる
- 上記の絵文字を Unicode で表すためのマッピング定義が各キャリアで公開されている。これもコードポイントはキャリアによって異なるが、いずれも基本多言語面の私用領域 (PUA,
U+E000
〜U+F8FF
) 上に配置されている。
DoCoMo | U+E63E - U+E757 |
au | U+E468 - U+E4E3
U+E4E5 - U+E5DF
U+E82E - U+E82F
U+EA80 - U+EB1D
U+EB1F - U+EB2D
U+EB30 - U+EB8E |
SoftBank | U+E001 - U+E05A
U+E101 - U+E15A
U+E201 - U+E25A
U+E301 - U+E34D
U+E401 - U+E44C
U+E501 - U+E53E |
例えば「晴れ」の絵文字は、DoCoMo: U+E63E
, au: U+E488
, SoftBank: U+E04A
となります。まあコードポイントの詳細はともかく、見事に定義がバラバラなためキャリア間で絵文字をやり取りするためには変換が必要な事、また各キャリアの絵文字は1対1に変換できるわけではないことを押さえておけば良いと思います。
2. Unicode 6.0 の絵文字について
現在では各キャリアの絵文字のほとんどが公式に Unicode に収録されています。よって、対応するフォントデータがあれば PC 等携帯電話以外の環境でも絵文字を扱うことができるようになります。仕様策定の中心となったのが Google と Apple という今のスマートフォンのメインプレイヤーであるため、スマートフォンの絵文字を理解する上でこの仕様を押さえておくことが非常に重要となります。
特徴は以下のようになっています。
- もともと Unicode にあった記号に割り当てられたものと、新たなコードポイントが割り振られたものが存在する。
- 新たなコードポイントが割り振られた文字の多くは追加多言語面に配置されている。
- 一部の文字 (国旗など) は結合文字によって表現することになっている。
- 例示図形が絵文字っぽくないものも……(笑)
「晴れ」の絵文字は
U+2600
に割り当てられています。
なお、各キャリアの絵文字との互換性は以下のようになっています。
すべての携帯/スマートフォンが Unicode 6.0 の絵文字コードでの入出力に対応すれば、環境差を一切気にすることなく絵文字をやり取りすることができるようになるわけです。
※ もちろん現時点ではそのようになっていないのでこの記事が存在するわけなんですが。
3. iOS 4 以前の絵文字対応
iPhone OS 2.2 から SoftBank 絵文字が取り扱えるようになりました。ソフトウェアキーボードからの入力は、i.softbank.jp や SMS/MMS に限られますが、Webブラウザでもメールアプリで入力してコピー&ペーストすることによって入力・表示が可能です。
絵文字のコードポイントは SoftBank の Unicode マッピングに準拠しています。
またどこかのバージョンから、Unicode 6.0 で定義された絵文字のうち SoftBank 絵文字の範囲についても対応するフォントデータが用意されており表示が可能になっています。
ブラウザで絵文字を表示する方法
SoftBank の Unicode マッピングの絵文字コードを表示可能です。
UTF-8 で記述されたページの場合は、 UTF-8 のコードをそのまま記述できます。もちろん HTML の数値参照形式で記述しても良いです。「晴れ」なら
0xEE818A
または "

" となります。
Shift JIS で記述されたページの場合は、HTML の数値参照形式で記述すれば良いです。「晴れ」なら "

" となります。
HTML のフォームから送られるコード
SoftBank の Unicode マッピングの絵文字コードが送られてきます。
UTF-8 で記述されたページの場合は、UTF-8 のコードがそのまま送られてきます。「晴れ」なら
0xEE818A
です。
Shift JIS で記述されたページの場合は、UTF-8 のコードが SJIS コードに変換されて送られてきます。このコードは通常の SoftBank の Shift JIS コードとは異なり、いわゆる Unicode から CP932(Windows-31J) への変換ルールによって変換されたものとなります。「晴れ」なら
0xF08B
です。
4. iOS 5 の絵文字対応
iOS5 で全てのアプリで絵文字入力が可能になると同時に、標準的に使われる絵文字のコードが SoftBank の Unicode マッピングから Unicode 6.0 の絵文字に変更されました。ドラスティックな変更を思い切って行うあたりがとても Apple らしく開発者泣かせではあります。
- Unicode 6.0 の絵文字全てのフォントデータが用意され、SoftBank 絵文字以外の、DoComo/au に由来する絵文字も表示できるようになりました。ただし白黒表示です。仕組み上はカラー表示にできるはずなので、データの準備が間に合わなかったのかやる気がなかったのかどちらかでしょう。
- ソフトウェアキーボードから入力される絵文字のコードも Unicode 6.0 のコードになります。
- 今のところソフトウェアキーボードから入力できる絵文字は SoftBank 絵文字由来の文字種に限られているようです。ほかの絵文字は白黒で見栄えが悪いからでしょうか。
ブラウザで絵文字を表示する方法
Unicode 6.0 の絵文字コード、SoftBank の Unicode マッピングの絵文字コードのどちらも表示可能です。記述の方式は iOS 4 以前と変わりません。「晴れ」なら、UTF-8 で
0xE29880
、
0xEE818A
、数値参照形式で "
☀
", "

" のいずれかとなります。
HTML のフォームから送られるコード
Unicode 6.0 の絵文字コードが送られてきます。
UTF-8 で記述されたページの場合は、UTF-8 のコードがそのまま送られてきます。「晴れ」なら、
0xE29880
です。
Shift JIS で記述されたページの場合は、UTF-8 のコードが HTML の数値参照形式(10進)に変換されて送られてきます。これは PC のブラウザでは一般的な挙動です(よく考えるとおかしいんですけどね……)。これは Unicode 6.0 の絵文字コードから Shift_JIS へのマッピングが存在しないからでしょう。「晴れ」なら、"
☀
" です。
5. Android の絵文字対応
Android では、絵文字は Google が定義した内部コードで管理されることになっているようです。実際のコードは上で触れた Unicode 6.0 の対応表で「Google」と書いてある列が該当します。特徴としては
- 3 キャリア分すべての絵文字が Unicode の私用面 (第15面) 上に配置されている (
U+FE000 - U+FEEA0
)
- Unicode 6.0 で結合文字の組み合わせで表される絵文字も独立したコードポイントが与えられている
- Unicode 6.0 の絵文字とはほぼ 1 対 1 で変換できる
と、いかにも内部コードっぽい性質を持っています。「晴れ」の絵文字をこのコードで表すと
U+FE000
となっています。
ただし Android 全体としての対応はここまでのようで、実際にこの絵文字を使うためには、