文字化けしないようにするには

とほほのWWW入門 > アラカルト > 文字化けしないようにするには
1998年5月24日作成 / 1999年10月29日修正

文字化けとは

Webページを見ていると、時たま日本語がちゃんと表示されないときがあります。これを「文字化け」と呼びます。文字化けをおこす原因はいくつかあります。

原因1:ブラウザが漢字コードの判定に誤ってしまう場合

【原因】日本語の漢字コードにはJIS、シフトJIS(Shift_JIS)、EUC(EUC-JP)などいくつもの種類があります。(→漢字コードについて) 通常はブラウザが自動的に漢字コードを判別するのですが、たまに判別を誤ってしまうことがあります。一般に、JISコード < シフトJIS < EUCの順で、文字化けする可能性が高いようです。

【対策】文書をJISコードで記述するか、「対策1:おまじないの文字を書く」、「対策2:文字コードを明示的に指定する」あたりを参照してください。

原因2:ブラウザの設定が変わってしまう場合

【原因】あるページを見ていると、ブラウザの文字コード設定(IE5.0の場合[表示]-[エンコード]、NN4.0の場合[表示]-[文字コードセット])がシフトJISやEUCに固定されてしまい、その後に、別の文字コードのページにジャンプすると、EUCのページをシフトJISの設定で見てしまい、文字化けすることがあるようです。

【対処】文字化けしたら、ブラウザ側で文字コードの設定を「自動判別」などに戻してもらうしか・・・文字コードを明示的に指定したページを見る場合に、この現象が多いような気がするのですが・・・

原因3:FTP転送時に文字化けしてしまう場合

【原因】Macintoshで海外版のFetchを使用して転送したりすると、文字化けしてしまうことがあります。これは、海外版のFTPソフトでテキストモード(ASCIIモード)で転送すると、漢字コードが崩れてしまう(最上位ビットが落ちてしまう)ために発生します。

【対策】バイナリモード(MacではRawモードとか生モードと呼んでいます)で転送する、日本語完全対応のFTPソフトを使用する。などの対処を行います。また、Macの英語版Fetchの場合は、[Preferences]-[Misc]-[Translate ISO characters]のチェックを外すと大丈夫との情報もいただきました。

原因3:CGIで書き出す文字が化けてしまう場合

【原因】「表示」が「侮ヲ」に化けたりするパターンです。これは、シフトJISで書かれたperlスクリプトをUNIXサーバーで実行させた時などに発生します。「表示」のシフトJIS漢字コードは「95 5C 8E A6」なのですが、この5Cというコードが "\n" などに使用されるバックスラッシュ(\)と重複しているために発生します。

【対処】スクリプトをEUCで記述するか、「表\示」のように、5Cのコードの次にもう一つバックスラッシュを挿入することで解決できます。

原因4:海外のサーバーを利用している場合

【原因】ロシアのサーバーを借りると文字化けが発生するという例がありました。これは、ロシアのとあるプロバイダーのサーバーが、すべてのHTML文書にロシア語のキャラクタセット(後述)を追加して返しているためでした。意外に盲点でした。

【対処】対処方法は、「対策2:文字コードを明示的に指定する」を参照してください。

対策1:おまじないの文字を書く

HTML文書の文字化け対策として、HTML文書の最初の方(<BODY>の前でも可)に、おまじないの文字をコメントとして記述する方法があるという情報をいただきました。シフトJISならシフトJISにしか存在しない文字を、EUCならEUCにしか存在しない文字をファイルの先頭に記述することにより、ブラウザの文字コード自動判別アルゴリズムにヒントを与えてあげようというものです。

シフトJIS文書の場合は、HTML文書の最初の方にひらがなをコメントで記述しておきます。シフトJISの「あ(82A0)」は、JISにもEUCにも存在しないコードなので、文字コード自動認識のヒントになります。

    <!-- あ(MOJIBAKE TAISAKU) -->

EUCの場合、シフトJISで半角カタカナが使用されていることを考慮されると、EUCにしか存在しない漢字コードは FDA1〜FDFE、FEA1〜FEFE の領域のみとなります。Yahooなどでは、HTML文書の先頭に以下のような文字コードを挿入しているようです。

    <!-- (FDFEのコードを持つ漢字) -->
しかし、この領域にはまだ漢字が割り当てられていないので、通常の漢字変換では入力することができません。漢字変換機能の文字コード入力機能を用いるなど、何らかの方法を用いて入力してください。

CGIから書き出すページの場合、例えばperlであれば、次のようにして記述することも可能です。

    print "<!-- \xfd\xfe(MOJIBAKE TAISAKU)-->\n";

また、FDFE文字が無理な場合でも、「龠(F3FE)」のように大きめな漢字コードの文字を記述しておけば効果はあるという情報も頂きました。(どのくらいの効果があるのかは未確認ですが・・・)

    <!-- 龠(MOJIBAKE TAISAKU) -->
ただ、これらのおまじないを記述しておいても、文字化けを100%解消できる訳ではないのでご注意ください。

対策2:文字コード(キャラクタセット)を明示的に指定する

HTML文書はHTTPというプロトコルで通信していますが、このプロトコルのヘッダに次のような記述を加えることにより、HTML文書の漢字コードを明示的に指定してやることができます。
   Content-type: text/html; charset=Shift_JIS
HTML文書で上記のヘッダを追加するには、<HEAD>〜</HEAD>の間に以下の1行を追加します。(→<META>)
   <META HTTP-EQUIV="Content-type"
             CONTENT="text/html; charset=Shift_JIS">
perlによるCGIスクリプトで指定する場合は、Content-typeを記述している1行を以下のように変更します。
   print "Content-type: text/html; charset=Shift_JIS\n\n";

シフトJISの場合は「Shift_JIS」ですが、EUCの場合は「euc-jp」を指定します。これをキャラクタセットと呼び、以下のものがあります。大文字・小文字は区別されません。

文字コード説明
iso-2022-jpJISコードであることを示す。
Shift_JISシフトJISであることを示す。ただし、これを指定すると、NN2.0で文字化けが発生する可能性がある。
x-sjisシフトJISであることを示す。Shift_JISが正式採用される前に仮に使用されていた名前。これを指定するとLynxなどのブラウザでは文字化けが発生する。
euc-jpEUCであることを示す。
x-euc-jpEUCであることを示す。euc-jpが正式採用される前に仮に使用されていた名前。
その他pその他の一覧については、http://www.isi.edu/in-notes/iana/assignments/character-sets を参照してください。

問題:文字コードを明示的に指定した場合の問題点

すべてのWeb関連アプリケーションが文字コードを適切に判断してくれればよいのですが、困った問題もあります。

【問題1】x-sjis は昔の暫定的なもので、Shift_JIS が後程定められた正しいものなのですが、NN2.0は、x-sjis しか知らないため、Shift_JIS を指定するとかなりの確率で文字化けをおこします。かと言って、x-sjis を指定すると今度は Lynx などの一部のブラウザがこれを解釈できず、文字化けします。

【問題2】まだこれは未確認ですが、文字コードを明示的に指定したページを見たあと、別のページにジャンプした時、両者の文字コードが異なっていると、文字化けが発生する確率が高くなるという情報もいただきました。

【問題3】一部のプロキシサーバーでは、プロキシサーバー内に情報をキャッシュする際に、文字コードを勝手に変換してしまい、charset= で指定した文字コードと矛盾を生じさせてしまう問題が発生するそうです。

では、結局、文字コードの指定はどうすればよいのかというと・・・現状のところ、明快な結論は出ていません。私の場合は、現状は、「少々の文字化けが発生することがあっても、とりあえず、もうしばらの間は文字コードを指定しない。」という案を採択しています。


Copyright (C) 1996-1999 とほほ
http://wakusei.cplaza.ne.jp/twn/wwwxx005.htm