PHP Include関数が不明な文字を出力する
-
09-06-2019 - |
質問
PHPのインクルード関数を使用すると、インクルードは正常に実行されますが、インクルードの出力が出力される前に文字も出力されます。その文字は16進値3Fであり、どこから来ているのかわかりませんが、すべてのインクルードで発生します。
最初はファイルのエンコードの問題かと思いましたが、問題ないようです。それを実証するためのテストケースを作成しました。(リンクが機能しなくなりました) http://driveefficiently.com/testinclude.php このファイルは以下のものだけで構成されています:
<? include("include.inc"); ?>
include.inc は次のもののみで構成されます。
<? echo ("hello, world"); ?>
それでも、出力は次のようになります。 "?こんにちは世界" どこ ?ランダムな値を持つ文字です。この値の起源はわかりませんが、時々私のサイトを少し台無しにしています。
これがどこから来たのかについて何か考えはありますか?最初はファイルのエンコードに関係があるのではないかと思いましたが、問題はないと思います。
解決
表示されているのは UTF-8 バイト オーダー マークです。
BOM の UTF-8 表現はバイト シーケンス EF BB BF で、UTF-8 を処理する準備ができていないほとんどのテキスト エディターや Web ブラウザでは ISO-8859-1 文字として表示されます。
PHP は、これらの文字を「非表示」にする必要があることを理解せず、通常の文字であるかのようにブラウザに送信します。これらを削除するには、先頭の BOM なしでファイルを UTF-8 として保存できる「適切な」テキスト エディタを使用してファイルを開く必要があります。
他のヒント
あなたの Web サーバー (またはテキスト エディタ) には、明らかに BOM 文書に。サイトのエンコーディングを明示的に Latin-1 に設定した場合を除き、ブラウザーに不正な文字は表示されません。すると、2 つの (!) UTF-8 BOM が表示されます。
/編集:あるという事実から、 二 BOM 私は、BOM が実際には編集者によってファイルの先頭に組み込まれていると結論付けています。どのようなエディタを使用していますか?Visual Studio を使用している場合は、[ファイル] メニューで [名前を付けて保存…] と言い、[エンコードして保存…] ボタンを選択する必要があります。そこで、「BOM なしの UTF-8」または同様のものを選択します。
Firefox や IE でレンダリングされたページには表示されませんが、IE でソースを表示すると面白い文字が表示されます。
これは Linux マシン上にありますか?vim または sed で検索と置換を実行して、その方法で 3F を削除できるかどうかを確認していただけますか?
Windows の場合は、メモ帳で include.inc を開いて、おかしな文字が表示され、削除できるかどうかを確認してください。
また、インクルードからコードをコピーして単独で実行するとどうなるかにも興味があります。
実はキャラクター3F は 疑問符は、単に 1 つとして表示されているわけではありません。
Thomas と同じ結果が得られますが、疑問符は表示されません。
理論的には、Web プロキシに何らかの問題がある可能性がありますが、PHP マークアップに疑問符が含まれているのではないかと疑う傾向があります。おそらく、すでに修正されているため、問題は発生していません。
なるほど hello, world
リンク先のページにあります。目に見える問題はありません...
Firefox 3.0.1 と Windows XP を使用しています。どのようなブラウザ/OS を実行していますか?おそらくそれが問題なのかもしれません。
また、コードを含めてコピーをコピーして、それ自体で実行した場合に何が起こるかを知りたいと思います。
マーク:これは共有ホスティング ソリューション上にあるため、ファイルへのシェル アクセスを取得できません。ただし、ご覧のとおり ここ, 、そこにあるべきではない文字はなく、同じファイルをスクリプトとして実行してもこの文字は生成されません。(共有ホスティング会社は何の役にも立たず、ブラウザの問題だと言い続けました)。