docomo(ドコモ)やauの絵文字の抽出をPHPで最も簡単にする方法

PHP, 絵文字, 文字コード, 文字化け, SJIS

10:43:57, by admin Email , 97 words, 35398 views   Japanese (JP) del.icio.us

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に格納する場合でも変換結果に工面することはない。
また、このまま独自タグとして使用することも可能。
(ちょっと不格好なので内部的に)

Trackback address for this post:

http://hain.jp/htsrv/trackback.php/59

Comments, Trackbacks:

Comment from: ss [Visitor]
auだとできないようですが…
PermalinkPermalink 2006/10/18 @ 18:48
Comment from: dozo [Member]
auでもwebならできますよ。
F3, F4, F6, F7の範囲です。


メールだと取得できないですけど。
PermalinkPermalink 2006/10/19 @ 01:11
Comment from: ss [Visitor]
>dozoさん
確認してみたところ、出来てました^^

ただauの絵文字をDoCoMoで表示するには工夫が必要ですね(^^;
PermalinkPermalink 2006/10/20 @ 13:31
Comment from: dozo [Member]
> ssさん
確かになんらかのマップデータが必要ですね。
PermalinkPermalink 2006/10/21 @ 18:12

Leave a comment:

Your email address will not be displayed on this site.
Your URL will be displayed.

Allowed XHTML tags: <p, ul, ol, li, dl, dt, dd, address, blockquote, ins, del, span, bdo, br, em, strong, dfn, code, samp, kdb, var, cite, abbr, acronym, q, sub, sup, tt, i, b, big, small>
(Line breaks become <br />)
(Set cookies for name, email and url)
(Allow users to contact you through a message form (your email will NOT be displayed.))
This is a captcha-picture. It is used to prevent mass-access by robots.

Please enter the characters from the image above. (case insensitive)

powered by b2evolution

shinobi

Neighbors
Relative
Favorites
PR

極論istの技術屋を始めて早幾年。 流れの速い業界の波にもまれながらも精一杯生きている様をとくとごらんあれ。

Archives
スポンサー

Latest bookmark
Search

Categories

Who's Online?
Misc
Syndicate this blog XML

Valid XHTML 1.0! Valid CSS! Valid RSS 2.0! Valid Atom 1.0!