UTF-8 ⇔ ( Shift_JIS EUC-JP ) へ文字コード変換時に、環境依存文字が文字化けする
AjaxでSELECTの値を変更してる際に引っかかった 罠。
Ajaxでの通信はUTF-8でやるもんだと考えているので、
なにも気にせず
$str = mb_convert_encoding( $str, "UTF-8","EUC-JP");
で変換して出力。
結果、環境依存文字(ⅠⅡⅢ など)が文字化けしてしまった。
SJIS,EUCの独自拡張文字というのかな? どうやらコードがUTF-8に存在しないらしい。
■対処方法は、SJIS-win,eucJP-win にすればいいようだ。
※IBM拡張文字(郄 硃 など)はどうがんばっても解決できなかった。
プログラム自体がEUC-JPだと表示をUTF-8とかにしてもダメかもしれない。
プログラム EUC-JP <? $str = 'あⅢ郄「硃」「絁」'; //$str = 'あⅢ'; header("Content-type: text/html; charset=UTF-8"); //echo $str.'<br>'; mb_language('ja'); mb_internal_encoding('EUC-JP'); mb_regex_encoding('EUC-JP'); mb_http_input('pass'); mb_http_output('pass'); echo mb_convert_encoding($str,"UTF-8","EUC-JP").'<br>'; echo mb_convert_encoding($str,"UTF-8","eucJP-win").'<br>'; echo mb_convert_encoding( mb_convert_encoding($str,"SJIS-win","EUC-JP"),"UTF-8","SJIS-win").'<br>'; echo mb_convert_encoding( mb_convert_encoding($str,"SJIS-win","eucJP-win"),"UTF-8","SJIS-win").'<br>'; //出力 あ????宗廖?宗 あⅢ??宗廖?宗 あⅢ???宗廖?宗 あⅢ??宗廖?宗
追記2009/09/29
ここには、3のパターンで出来るとは書いてあるがうちの環境ではどっかで引っかかっているらしくできない。
だが、ソース上に記述は化けるが
データベースを経由してのメール送信ではできていたので
合っているのかもしれない。
検証したいが時間ガナイ。
あと調べていたときに見つけた JQueryでのajax文字コード指定。
これを使えば mbで変換しなくとも文字化けせずに出力ができるようだ。
$.ajax({ type: "POST", dataType: "html", url: "ajax_response.php", data: $("form").serialize(), success: function( data ){ $("#"+ dId ).html( data ); } beforeSend: function(xhr){ xhr.overrideMimeType("text/html;charset=EUC-JP"); }, });