UTF-8文件的BOM頭的來由及去除方法


1. 什么是BOM頭
    在utf-8編碼文件中BOM在文件頭部,占用三個字節,用來標識該文件屬於utf-8編碼,現在已經有很多軟件識別BOM頭,但還是有些不能識別BOM頭,比如PHP就不能識別BOM頭,這也就是用記事本編輯utf-8編碼的PHP文件后,就會報錯的原因。
 
2. 包含BOM頭文件的產生
    在windows環境下,用記事本打開任何一個文本文件,另存為utf-8格式后,這樣文件就自動被加上了BOM頭信息。
    比較:
             utf-8(含BOM頭)
            
 
             utf-8(不含BOM頭)
            
    
    從上圖的比較中,可以很明顯的看出,含BOM頭的文件多出三個字節 efbbbf。
 
3. BOM頭信息的去除方法
    用Notepad++打開文件,選擇 格式 -> 以UTF-8無BOM格式編碼,再保存就行。如下圖:
    
 
4. 在PHP類的項目中,自動處理BOM頭信息(只需要將此文件放在項目根目錄下,從瀏覽器訪問即可)
<?php

if (isset($_GET['dir'])) { //設置文件目錄   
    $basedir = $_GET['dir'];
} else {
    $basedir = '.';
}

checkdir($basedir);

/**
* 遍歷目錄
* @param string $basedir 基礎目錄
*/

function checkdir($basedir) {
    if ($dh = opendir($basedir)) {
        while (($file = readdir($dh)) !== false) {
            if ($file != '.' && $file != '..') {
                if (!is_dir($basedir . "/" . $file)) {
                    echo "filename: $basedir/$file " . checkBOM("$basedir/$file") . " <br>";
                } else {
                    $dirname = $basedir . "/" . $file;
                    checkdir($dirname);
                }
            }
        }
        closedir($dh);
    }
}

/**
* 檢查BOM頭
* @param string $filename 文件名
* @param int $auto 是否自動處理,默認自動處理
*/

function checkBOM($filename, $auto = 1) {
    $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.  <a href=http://www.cnblogs.com/lfire/archive/2012/11/20/2778939.html>lfire博客</a></font>");
        } else {
            return ("<font color=red>BOM found.</font>");
        }
    }
    else
        return ("BOM Not Found.");
}

/**
* 重寫文件
* @param string $filename 需要重寫的文件
* @param mixed $data 要重寫的數據
*/

function rewrite($filename, $data) {
    $filenum = fopen($filename, "w");
    flock($filenum, LOCK_EX);
    fwrite($filenum, $data);
    fclose($filenum);
}

?>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM