ホームページ  >  記事  >  バックエンド開発  >  php.iniでzlib圧縮出力をオンにしたことによる文字化けに関する問題について

php.iniでzlib圧縮出力をオンにしたことによる文字化けに関する問題について

WBOY
WBOYオリジナル
2016-06-13 12:11:071242ブラウズ

php.ini で zlib 圧縮出力をオンにしたことによる文字化けの問題について

次のような PHP スクリプトがあるとします。

<?phpob_clean();echo "hello world";


通常、このスクリプトを実行すると問題はありません。結果が Google Chrome ブラウザに表示されます。



ただし、php.ini 設定を変更した場合ファイル、zlib 圧縮出力を有効にします:



上の赤いボックスの設定オプションをオンに変更し、保存して Apache を再起動し、今すぐスクリプトを実行すると、文字化けが表示されます:



これはなぜですか? PHP スクリプトを変更して、echo ステートメントをコメントアウトしてみましょう。

<?phpob_clean();//echo "hello world";


次にこのとき、php.ini 設定ファイルで zlib 圧縮出力がオンになっている前提で、ob_clean() を直接使用すると余分な出力が発生するため、文字化けの原因がわかります。ブラウザに奇妙な文字:



IE を変更してみてください。結果は同じです。特殊文字のスタイルのみが変更されました:



Linux でも同じ問題が Windows でも存在します。これは、Windows の問題ではないことを証明しています。では、この特殊文字を削除するにはどうすればよいでしょうか。 ob_clean() を使用する前に ob_start() を使用する限り、これは非常に簡単です。

<?phpob_start();ob_clean();echo "hello world";
ob_start() を追加した後、後続のhello worldは文字化けせず正常に表示できました。


これで結論を導き出すことができます: ob_clean() が PHP スクリプト内で直接呼び出され、サーバーの php.ini zlib 圧縮出力をオンにすると、後続の出力内容がすべて文字化けします。この時点で、zlib 圧縮出力をオフにするか、ob_clean() の前に ob_start() を追加する必要があります。そうしないと、この問題を解決できません。ただし、プログラマには通常、サーバー構成を変更する権限がないことを考慮して、コーディングするときは、ob_clean() を使用する前に ob_start() を呼び出すことを忘れないでください。


最後に、その理由についてzlib が出力を圧縮した後、ob_clean() を直接呼び出すと、プログラムが余分な特殊文字を出力し、文字化けが発生します。ただし、この問題は、閉じた後は問題なく実行されます。 、または PHP マスターならその理由を説明できますか?




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