絵文字のメールでの投稿
情報無いんでテストしながらめも。
処理はメールのエイリアス作ってphpに丸投げ。
もちろん直接送ると絵文字は〓になるので、他の方法で。
方法1 willcomメール経由
willcomのメールの転送設定でPCに送ると、どの携帯電話の絵文字でも
docomoのshift-jisの形式で送ってくれる。楽だけど、docomoにない文字がダメ。
方法2 gmail経由
gmailで携帯のメールを転送すると
docomoもsoftbankもshift-jisで来るので MobilePictogramConverter に投げてやれば終了。
[しかし、softbankは例外がありそうで怖い]
Auだけは、iso-2022-jpで来るが Eメール送出用JISコード で来る。
これは MobilePictogramConverter で対応してないので、変換する必要があって
まず、mb_convert_encoding() で shift-jisに変換すると、
「メール送出用JISコードに対応したShift-JISコード」と呼ばれるものになるので、
2バイト文字の1バイト目を
0xEB -> 0xF6
0xEC -> 0xF7
0xED -> 0xF3
0xEE -> 0xF4
に変換する。
//Ezweb Eメール送出用JISコードから絵文字用SJISコードに変換 function eMJIS2eSJIS ( $str ) { $str = mb_convert_encoding( $str,"SJIS-win","JIS"); $str = unpack("C*", $str); $len = count($str); $buff = ""; $n = 1; while($n <= $len) { $ch1 = $str[$n]; $ch2 = isset($str[$n+1])?$str[$n+1]:""; if ( $ch2=="" || ($ch1 >= 0x20 && $ch1 <= 0x7E) ) { $buff .= pack("C", $ch1); } else if( $ch1 == 0xED && ( ( $ch2 >= 0x40 && $ch2 <= 0x7E ) || ( $ch2 >= 0x80 && $ch2 <= 0xFC ) ) ) { $buff .= pack("C",0xF3).pack("C",$ch2); $n++; } else if( $ch1 == 0xEE && ( ( $ch2 >= 0x40 && $ch2 <= 0x7E ) || ( $ch2 >= 0x80 && $ch2 <= 0x93 ) ) ) { $buff .= pack("C",0xF4).pack("C",$ch2); $n++; } else if( $ch1 == 0xEB && ( ( $ch2 >= 0x40 && $ch2 <= 0x7E ) || ( $ch2 >= 0x80 && $ch2 <= 0xFC ) ) ) { $buff .= pack("C",0xF6).pack("C",$ch2); $n++; } else if( $ch1 == 0xEC && ( ( $ch2 >= 0x40 && $ch2 <= 0x7E ) || ( $ch2 >= 0x80 && $ch2 <= 0xFC ) ) ) { $buff .= pack("C",0xF7).pack("C",$ch2); $n++; } else { $buff .= pack("C", $ch1).pack("C",$ch2); $n++; } $n++; } return $buff; }
3年も違うのがのってた・・・ 条件外の文字の出力でなぜか1バイトだけ進めてた・・・