i-mode(iモード)やezwebの絵文字処理はこれが一番簡単。
(ノ・・)ン。。。。。。(((●コロコロッ
ケータイページを作る上で、
悩みの種となるのがある。
一つは端末依存。
各キャリア、各機種によって挙動がまちまち。
これを如何に知っているかが鍵となったりする。
もう一つが絵文字だ。
キャリア別に絵文字の規格があるのだが、
DocomoとauはSJISの外字を使っている。
これがなかなか扱いにくい。
PHPで内部コードSJIS以外にしていると絵文字の処理に苦労することになる。
だからといって、
内部コードをSJISにするのは論外だ。
内部コードはEUCかUTF-8でなければならない。
文字コードの変換には通常mb_convert_encodingを使うことになる。
(iconvでも可能)
だが、絵文字付きの文字列をmb_convert_encodingに通すと、
絵文字が消滅したり、文字化けが発生したりする。
なので、SJISのままリクエストを受け付け、
文字列の先頭から一つずつ調べていき、
文字コードが絵文字の時だけ変換するといった途方もないことをしなければならない。
もっと良い方法はないの?(・ω・)
実は一つある。
mb_convertを打つ前に一つ仕掛けをしておくのだ。
[More:]
それが
mb_substitute_character
mb_substitute_characterとは?
http://jp2.php.net/manual/ja/function.mb-substitute-character.php
mb_substitute_character() は、入力文字エンコーディングが 無効、または出力文字エンコーディングに文字コードが存在しない場合の代替文字を指定します。 無効な文字は、ヌル(出力しない)、文字列または整数値(Unicode文字コード値)に 置換することが可能です。
文字コードに異常なものが含まれている場合、
特定の文字列に変換したりすることが出来る。
ちょうど、DoCoMoで絵文字付きメールを外部に送信したときに、
ゲタ(〓)になるのと同じ。
あれは出力時にmb_substitute_character(0x3013);を設定しているのだ。
設定例に
/* Unicode U+3013 (ゲタ記号)を設定 */
mb_substitute_character(0x3013);
/* HEX フォーマットを設定 */
mb_substitute_character("long");
/* カレントの設定を表示 */
echo mb_substitute_character();
ある。
この、二番目'long'というのが重要。
絵文字を含んだ文字列をmb_convert_encodingする前に、
mb_substitute_characterしておくとどうなるか。
サンプルはこう。
<?
$str = "[数字1の絵文字]です";
mb_substitute_character("long");
$str = mb_convert_encoding( $str, "EUC-JP", "SJIS" );
echo $str;
?>
結果はこう。
BAD+F987です
(゜Д゜)ハァ?
どういう事かというと、
数字の1の絵文字の文字コードは
0xF987
これがmb_substitute_characterを通すことで、
BAD+[SJISコード]
になって出力されたのだ。
同じ要領でiモードとauのすべての絵文字を処理できる。
こうなればあとは簡単。
正規表現でBAD+[SJISコード]を抽出すれば良いだけ。
単なるASCIIコードなのでDBに格納する場合でも変換結果に工面することはない。
また、このまま独自タグとして使用することも可能。
(ちょっと不格好なので内部的に)