goo blog サービス終了のお知らせ 

ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

1つの画面で複数の文字コードの内容を表示する-IE以外なら可能

2013-10-31 12:31:57 | JavaとWeb
ある画面がSJISないしUTF8で、その画面にLinuxのログを表示したい。
LinuxのログはEUC-JP
なんていう場合、1つの画面に、SJISとEUCのように、複数の文字コードを
表示しないといけないことになる。

これは、可能なのか?

結論から言うと

・ログのようなテキストファイルを送る場合、
  IE以外なら可能

・IEの場合は、
  サーバ側で「Content-Type:」で文字コードを指定できないとX
  →つまり、テキストでは、そういうことができない(たぶん)。
   PHPとか、JSP,サーブレットなどで処理する必要がある




■基本的方針

 IFRAMEを使うと、IFRAMEの中に、文字なりHTMLを書き出すことが出来る。
 そこで、この

    IFRAMEの中の文字コードをSJISに変えれば、SJIS文字列が
    IFRAMEの中の文字コードをUTF8に変えれば、UTF8文字列が
    IFRAMEの中の文字コードをEUCに変えれば、EUC文字列が

 表示できるはずです※・・・めでたしめでたし・・・


 ・・・とはならないのです。
 この文字列をajaxを使って受け取り、表示させようとすると、
 なぜか勝手に、UTF-8と思って処理してくれます。
 なので、UTF-8以外のコードの文字列では、おかしな文字に変換されてしまいます。

 この変換を、断固として、阻止しなければなりませぬ!

※なお、EUC以外のSJIS,UTF-8は、IFRAMEのSRCに指定すると、IEでもChromeでも判断して
  表示してくれる




■どこで、判断しているのか?

どうも、変換してしまうのは、ヘッダーの

     Content-Type: text/html;charset=shift-jis

のところの指定が、ないからのようです。
そりゃー、テキスト表示してるんですから、ここは、操作できませんもんね。

なので、ここを、強制的に

beforeSend: function(xhr){
xhr.overrideMimeType("text/html;charset=EUC-JP");
},

と送ってしまい、その内容を表示させればいいようです
・・・・IE以外は・・・




■でもIEは・・・

ここがうまく行かないようです。
なので、現状、UTF-8でしかいきません。
IEで、うまく表示させるには、
サーバー側で、
     Content-Type: text/html;charset=shift-jis
を送らないといけないということですかね・・・




■サンプルコード

<html>
<head>
<script type="text/javascript" 

src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.1/jquery-ui.min.js"></script>
<title>インラインフレーム内に文字を表示する</title>
<script language="JavaScript"><!--
$(function(){ 
	$.ajax({
		type:"POST",
		url: "sjis.txt",
		datatype:"text",
		beforeSend: function(xhr){
     			xhr.overrideMimeType("text/html;charset=Shift_JIS");
		},
		success: function(msg){
			myFrame1.document.open();
			myFrame1.document.charset='Shift_JIS';
			myFrame1.document.write(msg);
			myFrame1.document.close();
 		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			alert(errorThrown);
		}
	});

	$.ajax({
		type:"POST",
		url: "utf8.txt",
		datatype:"text",
		beforeSend: function(xhr){
     			xhr.overrideMimeType("text/html;charset=UTF-8");
		},
		success: function(msg){
			myFrame2.document.open();
			myFrame2.document.charset='UTF-8';
			myFrame2.document.write(msg);
			myFrame2.document.close();
 		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			alert(errorThrown);
		}
	});

	$.ajax({
		type:"POST",
		url: "euc.txt",
		datatype:"text",
		beforeSend: function(xhr){
     			xhr.overrideMimeType("text/html;charset=EUC-JP");
		},
		success: function(msg){
			myFrame3.document.open();
			myFrame3.document.charset='EUC-JP';
			myFrame3.document.write(msg);
			myFrame3.document.close();
 		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
			alert(errorThrown);
		}
	});

}); 
// --></script>
</head>
<body>
<H1>文字コードが違う場合(このページはSJIS)</H1>
<iframe name="myFrame1" width="320" height="240"></iframe>
<iframe name="myFrame2" width="320" height="240"></iframe>
<iframe name="myFrame3" width="320" height="240"></iframe>

</body>
</html>




なお、「document.charset」は、それをしてもだめだめということを
示すためにやっているだけで、その行を削除しても、以下の表示は
変わらない(つまり、
myFrame1.document.charset='Shift_JIS';
myFrame2.document.charset='UTF-8';
myFrame3.document.charset='EUC-JP';
の3行は不要)。

このコードのほかに、このコードと同じフォルダ(ディレクトリ)に
SJISで書いたsjis.txt
EUCで書いたeuc.txt
UTF-8で書いたutf8.txt
の3種類のファイルを用意する(その内容が書き出される)




■結果

Chrome

IE



参考サイト
インラインフレーム内に文字を表示する
http://www.openspc2.org/reibun/javascript/frame/007/index.html


複数の文字コードをformからCGIへ送信する方法
http://search.web-sun.com/zatu/charset.html


jQuery.ajax で overrideMimeType する方法Add http://d.hatena.ne.jp/teramako/20080913/p1

AjaxでShift_JISのファイルを取得する
http://www.polidog.jp/2010/06/07/ajax%e3%81%a7shift_jis%e3%81%ae%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e3%82%92%e5%8f%96%e5%be%97%e3%81%99%e3%82%8b/

この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Gooメールを有料版にしてみた! | トップ | 日付などの0埋めあれこれ »
最新の画像もっと見る

JavaとWeb」カテゴリの最新記事