8 に答える
実際、BOM はブラウザに送信される実際のデータです。ブラウザーは喜んでそれを無視しますが、それでもヘッダーを送信することはできません。
問題は本当にあなたとあなたの友人のエディター設定にあると思います。BOM がないと、友人のエディターがファイルを自動的に UTF-8 として認識しない場合があります。彼は、エディタがファイルが UTF-8 であることを期待するようにエディタを設定しようとすることができます (NetBeans などの実際の IDE を使用している場合、これはコードと一緒に転送できるプロジェクト設定にすることもできます)。 .
別の方法として、いくつかのトリックを試してみることもできます。編集者によっては、入力されたテキストに基づいてヒューリスティックを使用してエンコーディングを決定しようとします。各ファイルを開始しようとすることができます
<?php //Úτƒ-8 encoded
おそらくヒューリスティックがそれを取得します。おそらくそこに置くべきより良いものがあります。どのような種類のエンコーディング検出ヒューリスティックが一般的かをグーグルで検索するか、いくつか試してみてください:-)
全体として、エディターの設定を修正することをお勧めします。
ちょっと待って、最後の部分を読み違えました: コードをどこにでも広めるには、すべてのファイルに下位 7 ビット文字、つまりプレーン ASCII のみを含めるか、古代のエディターを使用している一部の人々が見ていることを受け入れるのが最も安全だと思いますあなたの名前は面白く書かれています。フェイルセーフな方法はありません。ヘッダーが既に送信されているため、BOM は間違いなく不良です。一方、UTF-8 文字のみをコメントに入れる限り、一部の編集者がエンコーディングを誤解した場合の唯一の影響は、奇妙な文字です。あなたの名前のつづりを正しくし、ヒューリスティックを対象としたコメントを追加して、ほとんどの編集者がそれを理解できるようにしますが、代わりに偽の文字が表示される人が常にいます.
BOM would cause Headers already sent
error, so, you can't use BOM in PHP files
これは古い投稿であり、既に回答されていますが、この BOM の問題に直面したときに見つけた他のリソースをいくつか残しておきます。
http://people.w3.org/rishida/utils/bomtester/index.phpこのページでは、特定のファイルに BOM が含まれているかどうかを確認できます。
現在のディレクトリに BOM を含むすべてのファイルを出力する便利なスクリプトもあります。
<?php
function fopen_utf8 ($filename) {
$file = @fopen($filename, "r");
$bom = fread($file, 3);
if ($bom != b"\xEF\xBB\xBF")
{
return false;
}
else
{
return true;
}
}
function file_array($path, $exclude = ".|..|design", $recursive = true) {
$path = rtrim($path, "/") . "/";
$folder_handle = opendir($path);
$exclude_array = explode("|", $exclude);
$result = array();
while(false !== ($filename = readdir($folder_handle))) {
if(!in_array(strtolower($filename), $exclude_array)) {
if(is_dir($path . $filename . "/")) {
// Need to include full "path" or it's an infinite loop
if($recursive) $result[] = file_array($path . $filename . "/", $exclude, true);
} else {
if ( fopen_utf8($path . $filename) )
{
//$result[] = $filename;
echo ($path . $filename . "<br>");
}
}
}
}
return $result;
}
$files = file_array(".");
?>
私はphp.netでそのコードを見つけました
Dreamweaver もこれに役立ちます。BOM を含めずにファイルを保存するオプションが提供されます。
遅い答えですが、それでも役立つことを願っています。さよなら
ご存知のように、php にはオプションがありzend.multibyte
、これを使用すると、php はエラーを発生させずに BOM 付きのファイルを読み取ることができHeaders already sent
ます。
php.ini ファイルから:
; If enabled, scripts may be written in encodings that are incompatible with
; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such
; encodings. To use this feature, mbstring extension must be enabled.
; Default: Off
;zend.multibyte = Off
PHP では、「headers already sent」エラーに加えて、BOM の存在がブラウザーの HTML をより微妙な方法で台無しにすることもあります。
PHP (W3C 国際化) に焦点を当てた問題の概要については、UTF-8 BOM が原因で発生する表示の問題を参照してください。
これが発生すると、通常、レンダリングされたページの上部に目立つスペースがあるだけでなく、Firefox または Chrome で HTML を調べると、ヘッダー セクションが空で、その要素が本文にあるように見えることがあります。
もちろん、ソースを表示すると、挿入された場所がすべて表示されますが、ブラウザーはそれを本文コンテンツ (テキスト) として解釈し、そこにドキュメント オブジェクト モデル (DOM) に挿入しています。
または、php.ini で出力バッファリングを有効にして、「ヘッダーが既に送信されている」問題を解決することもできます。サイトに大きな負荷がかかる場合は、パフォーマンスのために出力バッファリングを使用することも非常に重要です。
実際、BOM は UTF-8 ファイルを識別する最も効率的な方法であり、最新のブラウザーと標準の両方がサポートしており、HTTP 応答本文での使用を推奨しています。
PHP ファイルの場合、ファイルではなく生成された出力が応答として送信されるため、すべての PHP ファイルを最初に BOM とともに保存することは明らかにお勧めできませんが、BOM を使用してはならないという意味ではありません。あなたの応答で。
実際、doctype 宣言の直前に次のコードを安全に挿入できます (応答として HTML を生成している場合)。
<?="\u{FEFF}"?>
(または PHP 7.0.0 より前: <?="\xEF\xBB\xBF"?>
)
詳細については、https ://www.w3.org/International/questions/qa-byte-order-mark#transcoding をご覧ください。