ページ上の元の漢字とデータベースから取り出した漢字のどちらかがすべて文字化けしているか、元の漢字とデータベース内の漢字の一方が正常に表示され、もう一方が文字化けしています。とても迷惑でイライラします! 問題は段階的に解決する必要があります。実際に以下の方法に従う前に、最終的に PHP プログラムをデバッグできるように、Web サーバーを PHP と統合するように構成する必要があります。一般的な GB2312 および UTF-8 文字セットをテストおよび説明する例として取り上げます。ブラウザはIE7.0です。
ページ上の元の中国語の文字化けを解決する方法
PHP 文字セットのエンコードの原理には触れません。オンラインで「PHP 文字化け」という文字列を検索すると、フルフレームの記事が見つかります。みんな読んでね。私が最も懸念しているのは、この現実的な問題をどのように解決するかです。私がよく使うテキスト エディターは UltraEdit です。これは、16 進数編集ができるだけでなく、ドキュメントのマルチエンコーディングをサポートしているためです。この問題を解決するには、UltraEdit のこの機能を使用する必要があります。
中国語 Windows を開き、UltraEdit を使用してテキスト ファイルを作成し、PHP ページ ファイルを手動で入力します。ファイルの内容は次のとおりです。 test1.php ファイルとして保存します。保存するときは、[形式] ドロップダウン ボックスで [デフォルト] を選択してください。ここでは特に注意してください。
<ol class="dp-xml"> <li class="alt"><span><span class="tag"><</SPAN><SPAN> </SPAN><SPAN class=tag-name>Html</SPAN><SPAN class=tag>></span><span> </span></span></li> <li> <span class="tag"><</SPAN><SPAN> </SPAN><SPAN class=tag-name>head</SPAN><SPAN class=tag>></span><span> </span> </li> <li class="alt"> <span class="tag"><</SPAN><SPAN> </SPAN><SPAN class=tag-name>title</SPAN><SPAN class=tag>></span><span>页面标题</span><span class="tag"><</SPAN><SPAN> /title</SPAN><SPAN class=tag>></span><span> </span> </li> <li> <span class="tag"><</SPAN><SPAN> </SPAN><SPAN class=tag-name>META</SPAN><SPAN> </SPAN><SPAN class=attribute>http-equiv</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>Content</SPAN><SPAN>-Type </SPAN><SPAN class=attribute>content</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>"text/html; charset=gb2312"</SPAN><SPAN class=tag>></span><span> </span> </li> <li class="alt"> <span class="tag"><</SPAN><SPAN> /head</SPAN><SPAN class=tag>></span><span> </span> </li> <li> <span class="tag"><</SPAN><SPAN> </SPAN><SPAN class=tag-name>Body</SPAN><SPAN class=tag>></span><span> </span> </li> <li class="alt"> <span>电脑学习网:</span><span class="tag"><</SPAN><SPAN> </SPAN><SPAN class=tag-name>br</SPAN><SPAN class=tag>></span><span> </span> </li> <li> <span class="tag"><</SPAN><SPAN> /body</SPAN><SPAN class=tag>></span><span> </span> </li> <li class="alt"> <span class="tag"><</SPAN><SPAN> /html</SPAN><SPAN class=tag>></span><span> </span> </li> </ol>
ウェブサイトのこのページをIEブラウザで開きます。ご覧のとおり、ページは正常に表示されます。 IEブラウザの「表示」→「エンコード」メニュー(「自動選択」にチェックあり)の文字コードはGB2312です。
[Firefox 2.0では正常に表示されます。 】
次に、UltraEditの「ファイル」メニューで「名前を付けて保存」を選択し、形式として「UTF-8」を選択し、ファイル名はtest2.phpです。このページをIEブラウザで開いてください。ご覧のとおり、ページは正常に表示されます (実際、英語のフォントがわずかに変更されています)。 IEブラウザの「表示」→「エンコード」メニュー(「自動選択」にチェック)を見ると、文字エンコードがUTF-8になっており、自動的に変更されました!注: この文は変更されていませんが、ブラウザは実際の PHP 文字セット エンコーディングを自動的に認識します。 IE は非常に賢いようで、IE による文字セットの自動識別が METE タグの charset=xxx の定義よりも優先されることもわかります。
【Firefox 2.0では文字化けが表示されます。 ]
ページのヘッダーに文
<ol class="dp-xml"> <li class="alt"><span><span class="tag"></span><span class="tag-name">php</span><span> </span></span></li> <li><span>header("Content-Type:text/html;</span></li> <li> <span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8"); </span> </li> <li class="alt"> <span class="tag">?></span><span> </span> </li> </ol>
を追加し、ページ ファイルを再度保存し、[形式] ドロップダウン ボックスで [デフォルト] を選択し、ファイル名を test3.php にします。サイト上のファイルをIEで開くと、今度は英語に加えて漢字も文字化けしてしまいました!同時に、IEブラウザの「表示」/「エンコード」メニュー(「自動選択」にチェックが入っていた)を見ると、文字コードがUTF-8となっており、強制的に変更されています。
中国語の文字化けが発生する原因は、本来のGB2312エンコードを強制的にUTF-8エンコードで表示させているため、文字化けが発生しているためです。このとき、ブラウザーで GB2312 エンコーディングが手動で指定され、ページ上の漢字が正常に表示されます (これは実際にページを作成するときはできません。閲覧者は PHP 文字セット エンコーディングを選択する必要があります。1 つは、視聴者は、エンコーディングをどのように選択すればよいのか、どのエンコーディングを選択すればよいのかまったくわからないかもしれません。私たちはあまりにも優秀すぎるようです。)
【Firefox 2.0では文字化けが表示されます。 ]
ページのヘッダーに文
<ol class="dp-xml"><li class="alt"><span><span class="tag"><</SPAN><SPAN> ?php </SPAN></SPAN><LI><SPAN>header("Content-Type:text/html;</SPAN><LI><SPAN class=attribute>charset</SPAN><SPAN>=</SPAN><SPAN class=attribute-value>GB2312</SPAN><SPAN>"); </SPAN><LI class=alt><SPAN class=tag>?></span><span> </span></span></li></ol>
を追加し、[形式] ドロップダウン ボックスから [UTF-8] を選択し、ファイル名を test4.php として再度保存します。 IE を使用して Web サイト上のファイルを開くと、奇妙なことがわかります。ページ上の中国語の文字は、予想される文字化けではなく、正常に表示されます。 ! IE ブラウザの [表示]/[エンコーディング] メニュー ([自動選択] がチェックされている) を見ると、PHP 文字セット エンコーディングがまだ UTF-8 のままであり、GB2312 文字セットに強制的に変更されていないことがわかります。
この時、ブラウザでGB2312エンコーディングを手動で指定したところ、IEブラウザではエンコーディングを手動で指定できないことが分かりました。 IE ブラウザは UTF-8 文字セットに特別な注意を払っているようです。 METAタグやPHP文での指定に関わらず、IEブラウザでは中国語文字化けを表示できません。
【Firefox 2.0では文字化けが表示されます。 】
要約すると、上記のテストは主に IE7.0 で実行され、Web サーバーは Windows Server 2003 の IIS6.0、PHP バージョンは 4.4.7 でした。 IE7.0 では、文字セットを正確に識別してその知性と親しみやすさを示すために、多くの追加の自動処理作業が行われていることがわかります。時々、勤勉すぎると圧倒されてしまうことがあります。中国語の文字化けの問題は、さまざまなブラウザとそのバージョン、Web サーバー、バックグラウンド スクリプト、およびさまざまな文字セットに関連しているため、問題は特に複雑です。 Web プログラマーは、主に自分に関連する要素に集中できます。PHP 文字セット エンコーディングの専門家になる必要はありません。現在普及している IE および FF ブラウザと互換性を持たせるために、次の簡単な方法で PHP コードを処理できます:
1. ページの実際の文字セットは、META タグで指定されたものと一致している必要があります。 2. header( "Content-Type:text/html;charset=xxx"); を使用することもできます。このステートメントは文字セットを指定しますが、文字の実際の文字セットや META タグと競合することはできません。 (テスト結果では、header() が META と競合する場合、header() が META で指定された文字セットよりも優先されることが示されています。これは、HttpWatch Basic 追跡によると、header() で文字セットを指定した後、IE ブラウザの Type がクリアされるためです。文字セットの仕様を取得しますが、他の非主流ブラウザが同じことを行うという保証はありません。)
3. PHP 文字セットのエンコーディングがデータベースから取得した文字の文字セットと競合することはできません。そうしないと、ページ自体に中国語の文字が含まれ、データベースから取得された中国語の文字がすべて文字化けします。