最近PHPでいろいろ作ってます。もし良ければ見ていってください。
メーリングリスト → http://www.easyml.info/
twitm -メール de twitter- → http://www.twitm.net/
メーリングリスト → http://www.easyml.info/
twitm -メール de twitter- → http://www.twitm.net/
PHPで絵文字変換 [プログラミング]
ケータイメールの絵文字を各キャリア毎変換する処理を作る事になって調べてみた。
変換処理はこちらの「絵文字変換ライブラリ HTML_Emoji」が使えそうです。
http://www.revulo.com/PHP/library/HTML_Emoji.html
MIT ライセンスだそうなので自由に使って大丈夫かな。
で、早速使ってみたわけですが、これがなかなか難しい。
ライブラリはwebサイトでの変換を想定して作られているらしく、UTF-8とSJISしか対応していない。
おかげで作りかけていた処理の内部文字コードをEUC-JPからUTF-8を使うように大規模修正orz
さらに受信したメールのデコード、エンコードがJISだったのをSJISにも対応。
さらにメールアドレスから変換の挙動をキャリア毎に振り分け。
思った以上にめんどくさいです。
そして最後にはまったのがauの絵文字。ライブラリだけではどうにもこうにも変換が上手くいかず、いろいろ調べたところauだけはwebで使う「KDDI絵文字用Shift-JISコード」とメールで使う「メール送出用JISコードに対応したShift-JISコード」なる2つのコードが用意されているということがわかった。
どうやらこの変換をかまさないと上手く変換できなようです。
で、どう変換すればいいかというとSJISの1バイト目のコードが下記コードの場合に置き換えすればいい。
メール web
0xEB <-> 0xF6
0xEC <-> 0xF7
0xED <-> 0xF3
0xEE <-> 0xF4
で、preg_replace()使えば楽勝かと書いてはみたわけですが。
$patterns[0] = '/\xEB([\x40-\x7E\x80-\xFC])/';
$patterns[1] = '/\xEC([\x40-\x7E\x80-\xFC])/';
$patterns[2] = '/\xED([\x40-\x7E\x80-\xFC])/';
$patterns[3] = '/\xEE([\x40-\x7E\x80-\xFC])/';
$replacements[0] = "\xF6\\1";
$replacements[1] = "\xF7\\1";
$replacements[2] = "\xF3\\1";
$replacements[3] = "\xF4\\1";
$string_new = preg_replace( $patterns, $replacements, $string );
※もちろんこの逆も必要。
一応受信したメールはを
JIS → メール用SJIS(PHP標準変換) → web用SJIS(上記変換) →UTF-8(HTML_Emoji使用)
で、期待する変換はできたわけですが・・
よく考えてみるとこれだと誤変換が起こりますorz
ってことはこの変換って1文字ずつチェックしなきゃできないんじゃないか??
さてどうしよう。
・参考にしたサイト
http://php.y-110.net/wiki/index.php?%B7%C8%C2%D3%A1%A7%B3%A8%CA%B8%BB%FA%A1%A7%CA%D1%B4%B9
http://blog.asial.co.jp/330
http://pochi.orz.ne.jp/oasis/archive_257.htm
変換処理はこちらの「絵文字変換ライブラリ HTML_Emoji」が使えそうです。
http://www.revulo.com/PHP/library/HTML_Emoji.html
MIT ライセンスだそうなので自由に使って大丈夫かな。
で、早速使ってみたわけですが、これがなかなか難しい。
ライブラリはwebサイトでの変換を想定して作られているらしく、UTF-8とSJISしか対応していない。
おかげで作りかけていた処理の内部文字コードをEUC-JPからUTF-8を使うように大規模修正orz
さらに受信したメールのデコード、エンコードがJISだったのをSJISにも対応。
さらにメールアドレスから変換の挙動をキャリア毎に振り分け。
思った以上にめんどくさいです。
そして最後にはまったのがauの絵文字。ライブラリだけではどうにもこうにも変換が上手くいかず、いろいろ調べたところauだけはwebで使う「KDDI絵文字用Shift-JISコード」とメールで使う「メール送出用JISコードに対応したShift-JISコード」なる2つのコードが用意されているということがわかった。
どうやらこの変換をかまさないと上手く変換できなようです。
で、どう変換すればいいかというとSJISの1バイト目のコードが下記コードの場合に置き換えすればいい。
メール web
0xEB <-> 0xF6
0xEC <-> 0xF7
0xED <-> 0xF3
0xEE <-> 0xF4
で、preg_replace()使えば楽勝かと書いてはみたわけですが。
$patterns[0] = '/\xEB([\x40-\x7E\x80-\xFC])/';
$patterns[1] = '/\xEC([\x40-\x7E\x80-\xFC])/';
$patterns[2] = '/\xED([\x40-\x7E\x80-\xFC])/';
$patterns[3] = '/\xEE([\x40-\x7E\x80-\xFC])/';
$replacements[0] = "\xF6\\1";
$replacements[1] = "\xF7\\1";
$replacements[2] = "\xF3\\1";
$replacements[3] = "\xF4\\1";
$string_new = preg_replace( $patterns, $replacements, $string );
※もちろんこの逆も必要。
一応受信したメールはを
JIS → メール用SJIS(PHP標準変換) → web用SJIS(上記変換) →UTF-8(HTML_Emoji使用)
で、期待する変換はできたわけですが・・
よく考えてみるとこれだと誤変換が起こりますorz
ってことはこの変換って1文字ずつチェックしなきゃできないんじゃないか??
さてどうしよう。
・参考にしたサイト
http://php.y-110.net/wiki/index.php?%B7%C8%C2%D3%A1%A7%B3%A8%CA%B8%BB%FA%A1%A7%CA%D1%B4%B9
http://blog.asial.co.jp/330
http://pochi.orz.ne.jp/oasis/archive_257.htm
コメント 0