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

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

Jun 23, 2016 pm 02:17 PM

キャラクターセット

著者: 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PHPロギング:PHPログ分析のベストプラクティス PHPロギング:PHPログ分析のベストプラクティス Mar 10, 2025 pm 02:32 PM

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

See all articles