【PR】 TOEIC750点保証講座
【PR】 BBフォンなどIP電話プロバイダ比較
【PR】 足の臭いにグランズレメディー
【PR】 デジカメ・DVDレコーダーなどデジタル家電もAmazon.co.jp
 

・ネスケ4.Xで「私」「自」「時」などが文字化けする対策

これまでの復習をしてみます。まず、ネットスケープ4.Xで、ウインドウをリサイズすると文字化けする場合について考えてみました。

条件1:ホームページの文字コードはEUC-JPである。
条件2:文字化けするのは「私」「時」「自」「市」など特定の文字である。具体的には、Shift_JISにした場合に1バイト目が「0x8E」という符号を持つ漢字188文字及び、2バイト目に「0x8E」を持つ文字42文字である。その漢字の一覧はこちらを参照してください。
条件3:文字化けするのは、Javascriptで、条件2の文字列を含む文章をdocument.writeしている場合のみである。条件2の文字列を含む文章もJavascriptを使わずに出力しているのならば、全く影響を受けない(ただし、一旦document.writeが出現すると、Javascriptで出力していない部分も、該当漢字は文字化けします)。



ibm.com スペシャル・キャンペーン情報

次に、前頁において、ネットスケープ4.Xのキャッシュ機構について考えてみました。そして、ネットスケープ4.Xにおいては、キャッシュ対象のページ内でJavascriptのdocument.writeが使われている場合には、一つのHTMLファイルに対して二通りのキャッシュファイルが作成され、片方(ここではキャッシュファイルBとします)は、「Javascriptのdocument.writeの結果のみ」が表示されていることを明らかにしました。そして、このキャッシュファイルBが上記の条件1+条件2が合わさると、文字化けしていることを明らかにしました。ウインドウをリサイズせずとも、ソースファイル自体(キャッシュファイルBの反映)が文字化けしているのだと。

では、この解決策はないのでしょうか? ちゃんとあります。まずは伝統的な手法から。
ソースファイルが文字化けしていてもWebmasterが困るぐらいで、一般のサイト訪問者の方は困りません。つまり、見た目だけを改善することとし、ソースファイルの文字化けはとりあえず無視して、ウインドウをリサイズされた場合にのみ対処することにします。しかも、IEのユーザーに対しては一切対策する必要がありませんので、ネットスケープ4.Xのユーザーの方がウインドウをリサイズした場合にのみ、対策を施すことにします。

ウインドウをリサイズすることによって文字化けしてしまったページは実はリロード(再読み込み)すると、文字化けが解消します。ただ、「文字化けしたらリロードしてください」とサイト訪問者に要求するわけにはいきません。Webmasterである我々の方で対処する必要があります。

まず、この、「ウインドウがリサイズされたら」というのは、Javascriptでイベントを拾うことが可能です。また、ネットスケープ4.Xのユーザーかどうかも、簡単なJavascriptで検出可能です。また、リロードもJavascriptで可能です。つまり、全部、Javascriptで可能です。サンプルコードは下記の通りになります。

文字化け対策サンプルコード
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>テスト5</title>
<script language="Javascript">
<!--
    if(document.layers) { //ネットスケープ4.Xならば
        window.onresize=resizeFunc; //リサイズ・イベント発生時に「resizeFunc」を起動
    }
    function resizeFunc(){
        location.reload();
    }
//-->
</script>
</head>
<body bgcolor=#FFFFFF>
<script language="Javascript">
<--
    document.writeln("試験の予定<br>");
    document.writeln("事件<br>");
    document.writeln("文字化けの理由<br>");
    document.writeln("日時・時間は<br>");
    document.writeln("私の名前<br>");

(一部省略)

    document.writeln("手鼻口目<br>");
    document.writeln("鳥取県<br>");
//-->
</script>
</body>
</html>



上記のようなコードを書けば、リサイズされた場合に、ネットスケープ4.Xの場合はリロードしますので、一瞬文字化けしたものが見えるにしても、最終的には、文字化けしない文章がブラウザには表示されます。しかし、この場合も、「ソースを表示」で表示されるソースは、 のように、やはり文字化けしたままです。

このソースビューアで見た時の文字化けはどうしようもないのでしょうか? 実は解決できるのですが、私がこの解決法を発見したのは意外なところからでした。ネットスケープではJavascriptのdocument.writeを利用している場合、document.writeした結果だけを表示するということは何度も述べてきました。これを何とかIEと同じように"ありのまま"にソース表示できないかと、あれこれ調べていた時のことでした。

結論から言いますと、魔法のメタタグ「<meta http-equiv='expires' content=''>」をHTMLヘッダー部分に入れるだけです。これにより、前頁の「ネットスケープのキャッシュ機構」で明らかにした、ネットスケープの"デュアル キャッシュ問題"は解決します。ネットスケープ4.Xのデフォルトのキャッシュフォルダーは「C:\Program Files\Netscape\Users\ユーザー名\cache」(Windowsの場合)です。このフォルダーを注視してみると、document.writeを用いているのに、一つしかキャッシュファイルは生成されません。そして、このキャッシュファイルは、IEと同じく"ありのままの"ソースであり、キャッシュファイルAです。ここに、二次方程式の解が二つではなく重根を持った時の如く、キャッシュファイルは一つに統一されました。ここでソースを表示してみることにします。

左の画像のように、Javascriptでdocument.writeしている部分も、そのままで表示されています(余談ですが、<script language=〜の行の下に一行空行が入り、同じように</script>の行の上も一行空行が入るのはネットスケープ4.Xの仕様のようです。)。IEでは当たり前のように思っていた機能が、ついにネットスケープでも実現できました。

ここで本題に戻ります。このメタタグを入れたままでウインドウをリサイズしてみたら、どうなるのでしょうか? 早速やってみます。文字化けしません。しかも、一番最初に紹介した「Javascriptのonresizeイベントの検出でリロードという手法」では、ほんの一瞬ですが文字化けした文字が見えていました。しかし、今回のやり方では、文字化け文字は全く見えません。


なぜ、このメタタグを入れると文字化けしないのでしょうか? 実は、この「<meta http-equiv='expires' content=''>」というメタタグはキャッシュ制御の際に利用されるメタタグです。つまり、このメタタグがあると、「常にサーバからドキュメントをダウンロードしなさい。ゆめゆめ、キャッシュファイルから読み込むというような、楽をしようという発想はしないように」という命令をブラウザは受け取ることになります。そのため、onresizeというネットスケープ4.Xにとっては「キャッシュファイルからドキュメントを読み込みなおし、そのウインドウサイズにあった形で再描画しなさい」という要求があった場合にも、必ず、そのドキュメントのあるサーバに再接続を試み、最新のドキュメントを取得しようとします。結果的に、キャッシュファイルからの読み込みは行われません。その結果、文字化けは起こりません。

また、必ずサーバからファイルをダウンロードしなおすわけですから、document.write用のキャッシュファイルBは作成する意味がありません。二度と再利用することはないからです。そもそも、document.write時に2種類もキャッシュファイルがあるのは、推測ですが、キャッシュファイルからの読み込みを高速にするために、あらかじめdocument.writeした結果を保存しておこう、という意向だと思われます。ただ、それがEUC-JPのドキュメントの場合、バグっていることが大きな問題なのですが、「キャッシュファイルからの読み込みはなしよ」と宣言されることで2種類準備しておく必要が全くなくなり、結果的に文字化けが解消するというわけです。

この解決法を導くために非常に時間がかかりましたが、ホームページにおける文字化け問題解決の鍵となる考えて方もいくつか出てきていますので、この解決法だけを読まれている方は是非、前の2ページ(「document.write時の文字化けの規則性」「ネットスープ4.Xのキャッシュ機構」)も是非、この機会にお読みください。

次のページでは、CGI(及びPHP)などの技術系メーリングリストでは、SuperFAQと言われる「表示」「可能性」「予定」「申し込み」などの文字の文字化け問題を取り扱います。