【PR】 【レンタルサーバーのスピーバー】 CGI・SSI・PHP・TELNET・SSH 全て標準装備・月額1,785円〜(税込)
【PR】 JavaScript暗号化ソフト「プランセスJS Encoder」
【PR】 ニュー・スーパーマリオブラザーズ・Wii
【PR】 Wiiフィット プラス(バランスWiiボードセット)
 

JSファイル内でdocument.writeしたら文字化け(Macネスケ4.7編)

前のページでは、Mac版IE4.5利用時にのみ発生するJSファイル内でのdocument.writeを取り上げました。Mac版IE4.5では、外部ファイルのエンコードをUTF-8であると決め付けるために文字化けが発生していたのですが、同様に、このページで取り上げるMac版ネットスケープ4.7でも同種の「決め付け」による文字化けが発生します。

Mac版ネットスケープ4.7では、ページの本体をShift_JISで作成し、JSファイルをShift_JISで作成している分には問題が発生しませんが、ページの本体をEUC-JPで作成し、JSファイルをEUC-JPにした場合に、左の画像のように文字化けが発生します。

EUC-JPの『あいうえお』が『』に化けるのは、今後さまざまな形で文字化け解決に役立つと思いますので、覚えておいたら良いですが、EUC-JPの文字列をShift_JISで無理やり読み込んだ場合です。つまり、Mac版ネットスケープ4.7では、Shift_JIS以外の文字コードでページ本体を作ると、そのページ本体の文字コードに合わせた文字コードで外部ファイルを作成すると文字化けします。

つまり、Shift_JIS以外の文字コードでページ本体を作成した場合、前のページのMac版IE4.5の対策と合わせて、下のような感じでJavascriptを書く必要があります。UA(ユーザー・エージェントもしくはブラウザ)を判別して、読み込む外部ファイルを変更します。

また、「Mac版ネットスケープ4.XでJavascriptが動かないとき」の章でも説明しましたように、Mac版ネットスケープ4.XでのみJavascriptが動かない事例になります。対策を施さないと、外部ファイルの読み込みに最初は失敗したかのように何もdocument.writeされません。.htaccessやHTTPヘッダーを活用することになります。詳しくはこちらを参照してください。

//ページ本体がShift_JIS以外で、外部ファイルであるJSファイル内でdocument.writeする必要がある場合の「Mac版IE4.5及びMac版ネスケ4.7の文字化け対策」
<html><head>
<--Mac版ネットスケープ4.Xだけで起こる問題として、このメタタグだけでは外部Javascriptファイルが最初のロード時に認識されない問題が発生します。第8章の「Mac版ネットスケープ4.XでJavascriptが動かないとき」を参照してください。.htaccessやHTTPヘッダーで文字コードをサーバ側で指定してあげる必要があります。-->
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<--ネスケ4.Xのdocument.writeで特定の文字が文字化けする対策として魔法のメタタグを入れる-->
<meta http-equiv='expires' content=''>
<title>Mac版IE4.5+Mac版ネットスケープ4.7の文字化け対策</title>
</head>
<body bgcolor=#FFFFFF>
<table border=1 cellspacing=0 cellpadding=8 bgcolor=#FFFF99><tr><td>
<script language="Javascript">
<!--
   var Mac = navigator.userAgent.indexOf("Mac") != -1 ? true : false;
   if(Mac && navigator.userAgent.indexOf("MSIE 4.5") != -1){
//Javascript内で「</script>」とdocument.writeすると、Mac版IE4.5では終了タグが現れたと勘違いしますので、「</sc」と「ript>」に分割してdocument.writeします。(このコメントさえも、Mac版IE4.5では終了タグと解釈し、正しく動作しないので、コピー&ペーストして使う場合はコメントを削除してください。)
      document.write("<script type=\"text/javascript\" src=\"js_utf8.js\"></sc" + "ript>");
   } else if(Mac && document.layers){ //Mac版ネスケ4.7対策
      document.write("<script type=\"text/javascript\" src=\"js_sjis.js\"></sc" + "ript>");
   } else {
      document.write("<script type=\"text/javascript\" src=\"js.js\"></sc" + "ript>"); //文字コードはEUC-JP
   }
//-->
</script>
<noscript>
Javascriptをoffにされているので表示できません。
</noscript>
</td></tr></table>
</body>
</html>



したがって、Mac版IE4.5用とMac版ネットスケープ4.7とそれ以外のブラウザ用のファイルの3種類が必要です。これはかなり面倒です。正直、Shift_JIS以外でページを作成する場合は、外部ファイル内でdocument.writeするのは避けたほうが無難でしょう。

ちなみに、.htaccessを使ってなんとか解消できないかと、「AddType "text/html; charset=EUC-JP" js」とやってみたましたが、これは駄目でした。ただ、「<script type="text/javascript" src="js.js" charset="EUC-JP"> 」などと外部ファイルの文字コードを指定してあげるのは、効果が見られました。(いずれにしても、先述のように、ページ本体の文字コードがEUC-JPであるために、対策なしでは、最初のロード時にはMac版ネスケ4.xでは、外部ファイルに記述したJavascriptが動きません。.htaccessもしくはHTTPヘッダーで明示的にEUC-JPであることを示す必要があります。具体的な方法はこちらを参照してください。)

次のページでは、「Javascriptのprompt関数でユーザー入力を受け付けるとゴミがつく問題<」 という文字化けを取り扱います。