AjaxでShift_JISやEUC-JPは使えるのか?-1- responseText編
(XHR/responseTextで読み込むファイルのcharset別 動作ブラウザ)

一般に、Ajaxで使用する文字コードは、UTF-8が推奨されていますが、日本では、過去の資産の多くがShift_JISやEUCで書かれており、 システム上そのデータの文字コードを変更することができないケースも少なくありません。

そこで、 AjaxでプレーンなShift_JISやEUCをそのままresponseTextで使えそうなブラウザとそのバージョンを調べてみました。その結果、最近のバージョンであれば、 案外多くのブラウザで利用できることがわかりました。

さらに、この結果と過去の調査を踏まえて、バグや文字化けリスクを抱えたバージョンのブラウザは、たとえXmlHttpRequestが使えるものでも勇気をもって静的HTMLなどへ分岐しよう、という場合に使えるブラウザ分岐コードも考えてみました。


【動作確認表】
リンクをクリックして確かめられます。
UTF-8 BOM
Win
f1f2e6e7o8o9
Mac
f1f2o8o9s1.2s2
Linux
f1f2o8o9k3.5
WinCE
x01ht
UTF-8N
Win
f1f2e6e7o8o9
Mac
f1f2o8o9s1.2s2
×
Linux
f1f2o8o9k3.5
WinCE
x01ht
Shift_JIS
Win
f1f2e6e7o8o9
Mac
f1f2o8o9s1.2s2
×
Linux
f1f2o8o9k3.5
WinCE
x01ht
EUC-JP
Win
f1f2e6e7o8o9
Mac
f1f2o8o9s1.2s2
××
Linux
f1f2o8o9k3.5
WinCE
x01ht

上記リンクをクリックすると、表示されるHTMLが文字化けすることもありますが、その場合は、 ブラウザ側のエンコーディング設定を手動で修正してご確認ください。 ブラウザのメニューから「表示」-「エンコーディング」などから該当するエンコードを選択してください。

Memo:
  • Opera8は、onreadystatechangeでイベントが2重発生してしまいます。v8.01で修正されました。
  • Opera8は、statusTextが使えません。v9で使用可能になりました。
  • Opera8は、CSSのopacityが使えません。v9で使用可能になりました。
  • Mac Safari1.2(v125)は、UTF-8 BOMの場合のみ文字化けしません。(v312.6ではBOM以外も大丈夫らしいです Thanx角谷泰志さん)
  • Mac Safari2のEUC-JP文字化けは、v419.3では発生しなかったそうです(Thanx角谷泰志さん)
  • Konqueror/3.3 は、UTF-8 BOMの場合のみ文字化けしません。
  • UTF-8(BOM付き)で作ったファイルは、BOM自体を解釈できずに文字化けしたりエラーを起こすケース(MacIEやPHP)もあります。
  • WinCEのx01htは、SoftBank携帯X01HTで、OSは正確にはWindows Mobile Version 5.0で、ブラウザは、IE Mobile です。

  • 【responseTextで推奨できそうなブラウザ】(上記動作確認表から○だけ抽出)
    UTF-8 BOM, UTF-8N, Shift_JIS, EUC_JP
    Win
    f1f2e6e7o9
    Mac
    f1f2o9s2
    Linux
    f1f2o9k3.5
    Memo:
    responseTextで日本語利用時のブラウザとして推奨できそうなブラウザは、下記の通りです。
    Win m1 f1 f2 e6 e7 o9
    Mac m1 f1 f2 s2 o9
    Linux m1 f1 f2 k3.4 o9
  • △推奨ブラウザの中では、EUCを利用する場合に、Mac Safari2が文字化けしますので注意が必要です。(本当はs2も推奨から外したいのですがMacデフォルトブラウザなので、、、。でも、確実なのは→responseXML)

  • 【参考:最近のブラウザシェア】
    W3Counter Global Web Stats
    July 24, 2006 
    
    Web Browser % 
    1 Internet Explorer 6.0 65% 
    2 Firefox 1.5 22% 
    3 Firefox 1.0 4% 
    4 Internet Explorer 7.0 2% 
    5 Safari 2.0 1% 
    6 Opera 9.0 <1% 
    7 Opera 8.5 <1% 
    8 Mozilla 1.7 <1% 
    9 Safari 1.3 <1% 
    10 Internet Explorer 5.5 <1% 
    
    上記、推奨できそうなブラウザ計 約97%
    

    【ブラウザ分岐サンプルコード】

    これは、上記安定したブラウザでのみAjaxを行い、それ以外のバグや文字化けリスクを抱えたバージョンは、たとえXmlHttpRequestが使えるブラウザでも勇気をもって静的HTMLなどへ分岐しようという場合に使えるコードです。

    
    	////
    	// 上記推奨できそうなブラウザ専用判定
    	//
    	// @sample        if(!chkAjaBrowser()){ location.href='nonajax.htm' }
    	// @sample        oj = new chkAjaBrowser();if(oj.bw.safari){ /* Safari code */ }
    	// @return        ライブラリが動作可能なブラウザだけtrue  true|false
    	//
    	//  Enable list 
    	//   WinIE 5.5+ 
    	//   Konqueror 3.4+
    	//   AppleWebKit系(Safari,OmniWeb,Shiira) 412+ 
    	//   Mozilla系(Firefox,Netscape,Galeon,Epiphany,K-Meleon,Sylera) 20011128+ 
    	//   Opera 9+ 
    	//
    	
    	function chkAjaBrowser()
    	{
    		var a,ua = navigator.userAgent;
    		this.bw= { 
    		  safari    : ((a=ua.split('AppleWebKit/')[1])?(a.split('(')[0]).split('.')[0]:0)>=412 ,
    		  konqueror : ((a=ua.split('Konqueror/')[1])?a.split(';')[0]:0)>=3.4 ,
    		  mozes     : ((a=ua.split('Gecko/')[1])?a.split(" ")[0]:0) >= 20011128 ,
    		  opera     : (!!window.opera) && (document.body.style.opacity=="") ,
    		  msie      : (!!window.ActiveXObject)?(!!(new ActiveXObject("Microsoft.XMLHTTP"))):false 
    		}
    		return (this.bw.safari||this.bw.konqueror||this.bw.mozes||this.bw.opera||this.bw.msie)
    	}
    
    

    【検証に使用したコード】

    呼び出される側のデータsjis.txtなど(各文字コードで保存します)

    今、読み込みました
    

    呼び出し側スクリプト(▲▲▲を文字コード別に書換えます UTF-8,Shift_JIS,EUC-JP)

    <meta http-equiv="Content-Type" content="text/html; charset=▲▲▲" />
    
    <script type="text/javascript">
    
      // XMLHttpRequestオブジェクト生成関数
      function createHttpRequest(){
        
        if(window.XMLHttpRequest){
        
          //Win Mac Linux m1,f1,o8 Mac s1 Linux k3 & Win e7用
          return new XMLHttpRequest() ;
          
        } else if(window.ActiveXObject){
        
          //Win e4,e5,e6用
          try {
            return new ActiveXObject("Msxml2.XMLHTTP") ;
          } catch (e) {
            try {
              return new ActiveXObject("Microsoft.XMLHTTP") ;
            } catch (e2) {  return null; }
           }
        } 
      }
    
      function sendReq(data,method,url){
      
        //XMLHttpRequestオブジェクト生成
        var oj = createHttpRequest();
        
        //着信コールバックメソッド
        oj.onreadystatechange =function () {
          if(oj.readyState==4){
            //レスポンスを取得
            var res  = oj.responseText;
            //レスポンスされた文字列をダイアログ表示
            alert(res);
          }
        }
    
        //open メソッド
        oj.open(method,url);
        
        //sendメソッド
        oj.send('');
        
      }
      
    
    </script>
    
    <form>
      <input type    = "button"
             value   = "test.txtを読み込み、ダイアログ表示します"
             onclick = "sendReq('','GET','./xxxx.txt')">
    </form>
    
    注意:そのページの文字コードがShift_JISやEUC-JPであっても、データ送出時には、
    UTF-8でURLエンコードされている必要があります。「UTF-8でURLエンコード」は、
    JavascriptのencodeURIComponent(文字列)によって処理できます。
    この処理は、一般的な、Ajax関連のライブラリには実装されています。
    
    もし、できるなら、http.confなどへのContent-Typeも指定しておきます。 .htaccessやhttp.confへのAddType設定(▲▲▲を文字コード別に書換えます UTF-8,Shift_JIS,EUC-JP)
    AddType "text/plain;charset=▲▲▲" .txt
    
    *もし、レンタルサーバーなどで自分ではcharsetを設定できなければ、そのサーバーの文字コードに合わせるのが安全です。


    今回、検証に利用したブラウザバージョン:

    Win f1 : バージョン 1.5.0.4
    Win f2 : バージョン 2.0b1
    Win e6 : バージョン 6.0.2900.2180.xpsp_sp2_gdr.050301-1519
    Win e7 : バージョン 7.0.5450.4
    Win o8 : バージョン8.00 Build 7561
    Win o8 : バージョン8.01 Build 7642
    Win o8.5 : バージョン8.5 Build 7702
    Win o9 : バージョン9.00 Build 8502

    Mac f1 : バージョン 1.5.0.4
    Mac f2 : バージョン 2.0b1
    Mac s1.2 : バージョン 1.2(v125)
    Mac s2 : バージョン 2.0.4(419.3)
    Mac o8.5 : バージョン 8.5 Build 2182
    Mac o9 : バージョン 9.00 Build 3447

    Linux f1 : バージョン 1.5.0.1
    Linux f2 : バージョン 2.0b1
    Linux o8.54 : バージョン 8.54 Build 1745
    Linux o9 : バージョン 9.00 Build 344
    Linux k3.5 : バージョン 3.5.3

    WinCE : X01HT Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; HTC/X01HT; PPC; 240x320)

    この他に、文字コードによって生じる文字化け調査
    http://jsgt.org/ajax/ref/charset_test/responsetext/test_1_make_table.php