あの死に物狂いのBOMを深く理解する

4626 ワード

BOM(Byte Order Mark)は、UTF符号化方式で符号化を識別するための標準マークであり、UTF-16では本来FFFEであり、UTF-8となるとEF BB BFとなる.このタグはオプションであり、UTF 8バイトは順序がないため、1バイトストリームがUTF-8符号化されているかどうかを検出するために使用することができる.マイクロソフトはこのような検査をしていますが、一部のソフトウェアはこのような検査をしないで、正常な文字処理と見なしています.
マイクロソフトは自分のUTF-8形式のテキストファイルの前にEF BB BFの3バイトを加えたが、windowsの上のnotepadなどのプログラムはこの3バイトに基づいて1つのテキストファイルがASCIIなのかUTF-8なのかを確定したが、これはマイクロソフトがひそかに作ったマークにすぎず、他のプラットフォームではUTF-8テキストファイルにこのようなマークはしていない.
つまり、UTF-8ファイルにBOMがあるかもしれないし、BOMがないかもしれないが、どうやって区別するのか.3つの方法.1,UltraEdit-32でファイルを開き,16進編集モードに切り替え,ファイルヘッダにEF BB BFがあるかどうかを調べる.2、Dreamweaverで開き、ページのプロパティを見て、「Unicode署名BOMを含む」の前にチェックがあるかどうかを見ます.3、Windowsのメモ帳で開き、「名前を付けて保存」を選択し、ファイルのデフォルトコードがUTF-8かANSIかを見て、ANSIであればBOMは付きません.
注:Convertzでgb 2312ファイルをUTF-8ファイルに変換する場合、デフォルト設定はBOMなしです.BOMを持たないと上記の文字化けしの問題が発生する可能性がありますが、BOMを持っていると、phpのincludeファイルに注意して、phpバイトストリームの前にEF BB BFが多く出て、ディスプレイに早めに出力するとプログラムエラーが発生する可能性があります.1つの解決策はincludeされたファイルがすべてANSIとして保存され、プライマリファイルはUTF-8であってもよい.1つのファイルをBOMから削除するには、UlterEditを使用して開き、16進編集モードに切り替え、一番前の3バイト(つまりEF BB BF)を20に置き換え、保存(保存時の自動バックアップ機能を閉じることに注意)、デフォルト編集モードに切り替え、一番前の3つのスペースを削除すればいいのです.
 
検査BOM:
function checkBOM($filename) {

    $contents = file_get_contents ( $filename );

    $charset [1] = substr ( $contents, 0, 1 );

    $charset [2] = substr ( $contents, 1, 1 );

    $charset [3] = substr ( $contents, 2, 1 );

    if (ord ( $charset [1] ) == 239 && ord ( $charset [2] ) == 187 && ord ( $charset [3] ) == 191) {

        if ($auto == 1) {

            $rest = substr ( $contents, 3 );

            rewrite ( $filename, $rest );

            return ("<font color=red>BOM found, automatically removed.</font>");

        } else {

            return ("<font color=red>BOM found.</font>");

        }

    } else

        return ("BOM Not Found.");

}

 
PHPで画像を出力する場合:
<?php
if(ob_get_length()){
    ob_clean();
}
header('Content-Type:image/jpeg');
echo file_get_contents("http://news.xinhuanet.com/mil/2014-01/10/125982671_13893100425461n.jpg");
?>

注意:WebファイルにBOMヘッダがあり、Webファイルをutf-8に保存する場合は必ず「utf-8にBOMヘッダがない」を選択します.そうしないと、ヘッダ出力があり、コードエラーが発生します.BOMヘッダやその他の空白コンテンツの影響を避けるために、コード内でobキャッシュを1回クリアすることができます.GBKファイルの上部に出力があれば、例えば空の行も同じです.とにかく上部に出力がないことを確認すればいいです.