ある画面が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
を送らないといけないということですかね・・・
■サンプルコード
なお、「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/
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/