絵文字のメールでの投稿

情報無いんでテストしながらめも。
処理はメールのエイリアス作ってphpに丸投げ。
もちろん直接送ると絵文字は〓になるので、他の方法で。


方法1 willcomメール経由
 willcomのメールの転送設定でPCに送ると、どの携帯電話の絵文字でも
 docomoのshift-jisの形式で送ってくれる。楽だけど、docomoにない文字がダメ。

方法2 gmail経由
 gmailで携帯のメールを転送すると
 docomosoftbankも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バイトだけ進めてた・・・