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>';

//出力????宗廖?宗
あⅢ?&#58190;?宗廖?宗
あⅢ???宗廖?宗
あⅢ?&#58190;?宗廖?宗

追記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");
  },
});