ホームページ >バックエンド開発 >PHPチュートリアル >Webページの文字セットの設定順序を解析する

Webページの文字セットの設定順序を解析する

WBOY
WBOYオリジナル
2016-06-23 14:17:131132ブラウズ

キャラクターセット

著者: 360weboy
Sina Weibo: http://weibo.com/360weboy
ブログ投稿リンク: http://www.360weboy.com/php/fundament/charset.html

先週私は仕事をしていましたECサイトを新システムに移行する際、一部の商品説明文字が常に文字化けして出力されることが判明し、文字セットに問題があると判断し、再度文字セットの調査を行った。ページの文字セットに影響を与える主な方法は次のとおりです:
1. ファイルのエンコード方法
2. Apache2 のデフォルトの文字セット設定
3. PHP.ini のデフォルトの文字セット設定
4. 手動でヘッダーを出力( 'Content-type: text in PHP script /html;charset=xxx');
5. HTML ページに
を追加します。上記の 5 つのメソッドを 1 つずつテストし、ブラウザーの文字に対する 5 つのメソッドの優先順位を決定しました。選択を設定します。まず、次の内容で utf8 でエンコードされた test.php ファイルを作成しました:



test.php にアクセスするには chrome を使用します。Chrome ブラウザのデフォルトの文字セットは utf8 ではなく、gb2312 または gbk である必要があるためです。ブラウザで次のような文字化けが発生しました:



ヘッダーとメタの優先度の比較

次に、最初に上記 2 つの方法 4 と 5 をテストしてみましょう。これらを HTML ページに個別に追加したところ、コンテンツは正常に表示されました。





ヘッダーのメタタグを削除し、header(‘Content-type: text/html; charset=utf8’); を追加すると、コンテンツが正常に表示されます。それで、メタタグとヘッダーのどちらの方法が優先されますか?ヘッダーはgb2312に設定され、メタはutf8に設定されます。



コンテンツが正常に表示されず、ヘッダーの優先度が高レベルであることを示します。ブラウザは、まず http ヘッダーに設定されている文字セットを採用し、次に HTML ページのメタ タグによって設定されている文字セットを採用します。



php.ini でデフォルトの文字セットを設定した場合の影響

次に、php.ini でデフォルトの文字セットを設定した後の状況を見てみましょう。優先度をテストするために、まずページ内のヘッダーとメタ設定の文字セットを gb2312 に変更すると、コンテンツは確実に文字化けして表示されます。次に、php.ini ファイルを開き、次の設定を見つけて、前の引用符を削除し、文字セットを utf8 に設定します。



設定後、忘れずに apache2 サーバーを再起動してください。結果は次のようになります。


php.ini がデフォルトの文字セットを utf8 に設定した後、それが応答ヘッダーの Content-type の最後に追加され、これにより、php スクリプトの header 関数を介して出力される gb2312 文字セットがカバーされます。は header の情報を使用し、内容が utf8 の文字セットであると考えており、最終的な内容は実際には正常です。 header関数やmetaタグよりもphp.iniにおける文字セット設定の優先度が高いことが分かります。

Apache2 のデフォルトの文字セットを設定する

最後に、テスト用に Apache2 のデフォルトの文字セットを設定しましょう。今回は、header、meta、php.ini の文字セットを gb2312 に設定し、次に apache2 のデフォルトの文字セットを utf8 に設定します。



apache2 サーバーを再起動します。内容は次のとおりです。





これを見ると分かるのですが、apache2の文字セット設定はhttpレスポンスのContent-Typeヘッダーに影響を与えないため、ブラウザはgb2312を使ってデコードすべきだと思い込み、文字化けが発生します。では、php.iniの文字セットの設定を外したら、ページは正常に表示されるのでしょうか?テスト後の表示は以下の通りです。



Apache2の文字セットの優先順位もヘッダ関数の文字セット設定よりも小さいようです。引き続きヘッダー設定を削除して見てみましょう:

上記は、apache2 の文字セット設定が、meta タグの文字セット設定よりも優先されることを証明しています。 httpヘッダーにcharset=utf8が追加されます。
上記の実験に基づいて、文字セット設定の優先順位は次のようになります: php.ini のデフォルトの文字セット設定 > ヘッダー関数の文字セットの設定 > apache2 のデフォルトの文字セットの設定

ディスカッション (解決策)

この結果には同意できません


テストには制限があります
1. 単一のブラウザ テストのみを使用しました
2. 1 つの言語テストのみを使用しました
3. 単一のファイル エンコーディング テストのみを使用しました

最大の問題は、すべてのテストがフォワード テストであるということです。つまり、期待を満たしていればその項目は正しいとみなされるのです。これは論理的なタブーです

実験プロセスには問題がないのに、導かれた結論が間違っているのはなぜでしょうか。

テスト済み:
default_charset の優先順位は、ヘッダー関数の文字セット設定よりも低いです

優先順位の順序は、友人とのテストによると正しいです。ご自身で確認してください。

snmr_com


テストの問題をご存知の場合、このプロセスを標準と見なすにはどのようにテストする必要があるか教えてください。 。ありがとう!

http://www.w3help.org/zh-cn/causes/HR9001
この記事を参照できますが、この記事は比較的古いです

完全帰納法の基礎は、すべての可能性を満たすことです。一貫した (唯一の) 結論を引き出すためです
さらに、あなたの命題のさまざまな可能性は「整然とした」特性に準拠していないため、数学的帰納法のような 2 段階検証を使用することはできません
したがって、テストしたい場合は、すべての可能性を調べなければなりません。すべての可能性を調べていない場合、結論は制限条件を追加することしかできません
たとえば、
1 つのブラウザーのみが関与し、結論はそのブラウザーにのみ絞り込むことができます
元の文書は 1 つのエンコーディングのみを使用します。結論は、この種のエンコーディングにのみ適用できます

基本的に、2 つまたは 3 つの制限条件を追加すると、適用範囲が非常に小さくなるため、結論は実用的な意味を持ちません
したがって、サポートするにはさらに多くのテストを行う必要があります結論のみを導き出すことができます
あなたの提案に含まれる条件は次のとおりです: ブラウザ、各優先順位のエンコード指定、言語ファミリー (特に、2 バイトの中国語、日本語、韓国語のエンコードなど、自動的に識別するのが難しい異なる言語ファミリー) 、ドキュメントエンコーディング、メイクア 順列と組み合わせには非常に多くの可能性があります...それらをすべてテストできたら、私は本当にあなたを尊敬します、笑

専門的な理論的指導、私はあなたの兄弟を尊敬します。 。 。時間があるときにもう一度歩き直してください。 。ご返信ありがとうございます

優先順位は友人とのテストによると正しいので、ご自身で確認してください。 php.ini



実行インターフェース


あなたのテストの結果は、私のテストの結果を表すものではありません
さらに、ヘッダーは関連するデフォルト値を変更できる必要があります。そうでなければ、他に何ができるでしょうか?

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。