zoukankan      html  css  js  c++  java
  • 深入理解那该死的BOM

           BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记,在UTF-16里本来是FF FE,变成UTF-8就成了EF BB BF。这个标记是可选的,因为UTF8字节没有顺序,所以它可以被用来检测一个字节流是否是UTF-8编码的。微软做这种检测,但有些软件不做这种检测, 而把它当作正常字符处理。

           微软在自己的UTF-8格式的文本文件之前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来确定一个文本文件是ASCII的还是UTF-8的, 然而这个只是微软暗自作的标记, 其它平台上并没有对UTF-8文本文件做个这样的标记。

           也 就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?三种方法。1,用UltraEdit-32打开文件,切换到十六进制编辑模 式,察看文件头部是否有EF BB BF。2,用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。3,用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8还是ANSI,如果是ANSI则不带BOM。

          注: 意用Convertz把gb2312文件转换成UTF-8文件时,默认设置是不带BOM的。不带BOM可能出现上述乱码问题,但是带 BOM,对于php的include文件要小心,会在php字节流前面多出EF BB BF,提前输出到显示器有可能会带来程序错误。一个解决方案是凡是被include的文件都保存为ANSI,主文件可以是UTF-8。要想把一个文件去掉 BOM,使用UlterEdit打开, 切换到十六进制编辑模式,把最前面三个字节(就是那该死的 EF BB BF)替换为20,保存(注意关闭保存时自动备份的功能),再切换到默认编辑模式,把最前面的三个空格去掉就可以了。

    检测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");
    ?>

      注意:网页文件有BOM头,将网页文件保存为utf-8时一定要选择“utf-8无BOM头”,否则会有一个头输出,导致代码出错。为了避免BOM头或其他空白内容影响,可以在代码里面先清除一次ob缓存。GBK文件 如果顶部有输出比如空一行也是一样的。
      总之确保顶部无输出就行。

  • 相关阅读:
    “学霸系统”app——NABC
    Scrum Meeting NO.1
    团队成员角色
    团队作业 #2
    团队作业 #1
    Qt, 我回来了。。。
    boost: tcp client sample
    makefile 中定义宏位置需要注意一下
    libpcap报文解析: ipv4、ipv6 @ 2014.7.2
    编程网站收集
  • 原文地址:https://www.cnblogs.com/thinksasa/p/3363519.html
Copyright © 2011-2022 走看看