• UTF8文件的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);
    }

    ?>
  • 相关阅读:
    怎么知道银行卡号对应的银行
    集合排序、map、枚举
    669. Trim a Binary Search Tree修剪二叉搜索树
    17. Merge Two Binary Trees 融合二叉树
    226. Invert Binary Tree 翻转二叉树
    530.Minimum Absolute Difference in BST 二叉搜索树中的最小差的绝对值
    191. Number of 1 Bits 二进制中1的个数
    Hamming Distance二进制距离
    136. Single Number唯一的数字
    276. Paint Fence篱笆涂色
  • 原文地址:https://www.cnblogs.com/lfire/p/2778939.html
Copyright © 2020-2023  润新知