zoukankan      html  css  js  c++  java
  • php -- PHP5中file_get_contents函数获取带BOM的utf-8文件内容

    最近,在用file_get_contents函数来取得文本的内容的时候,出现了一个情况(如下),苦思冥想了n久,不得其解,最后,果然还是得靠百度啊.....

    百度到一个解释,下面是原文:

    PHP5中的file_get_contents函数获取文件内容,实际是按二进制来读取的,所以,当你用file_get_contents去获取一个带BOM的UTF-8文件时,它并不会把UTF-8的BOM去掉,当你把读取的内容当作文本内容来进行一些操作时,可能会发生一些意想不到的结果。这并不能算作一个BUG,因为file_get_contents函数读取文件的时候,是按二进制来读取的,读取到的内容是包含BOM的,而用户操作的时候,想当然的以为读取到的内容是不包含BOM的文本内容(如用记事本打开后看到的内容),因为BOM在编辑软件中是不可见的,只有在十六进制模式下才可以看见,问题也就出在这,实际上是由于“操作不统一”造成的。

    当对UTF-8编码的文件进行操作时,如果要把读取的内容当作文本内容来处理,最好先对BOM进行一些处理,这个问题在PHP6中得到了解决(可以设置文本/二进制读取模式),有兴趣的朋友

    可以自己查找PHP6的手册。

    一个较简单的解决方法:

    1 <?php
    2 $dataStr = file_get_contents('test.txt');
    3 if (strpos($dataStr, "xEFxBBxBF") === 0) { //x表示16进制
    4     $dataStr = substr($dataStr, 3);
    5 }
    6 // 对$dataStr进行操作
    7 ?>

    或者用正则来处理:

    1 <?php
    2 $dataStr = file_get_contents('test.txt');
    3 if (preg_match('/^xEFxBBxBF/', $dataStr)) {//x表示16进制
    4   $dataStr = substr($dataStr, 3); 
    5 } 
    6 // 对$dataStr进行操作 
    7 ?>

    什么是BOM?

    BOM是Byte Order Mark的缩写,即字节顺序标记,它是插入到UTF-8,UTF-16或UTF-32编码的Unicode文件开头的特殊标记,用来标识Unicode文件的编码类型。

    几种编码对应的BOM:

    EF BB BF        UTF-8
    FE FF             UTF-16 (big-endian)
    FF FE             UTF-16 (little-endian)
    00 00 FE FF UTF-32 (big-endian)
    FF FE 00 00 UTF-32 (little-endian)

    对于UTF-8编码的文件而言,BOM标记是可有可无的,Windows自带的记事本文件在保存为UTF-8编码时,会自动加上BOM,现在一些编辑软件,可以在保存为UTF-8编码时可以选择是否带

    BOM保存。

    对于PHP文件,在使用UTF-8编码时,最好都不要BOM保存。因为当你使用include/require/include_once/require_once这些函数去包含一个带BOM的文件时,你得到的网页,在某些兼容性

    不是很好的浏览器下,你会发现你的网页的实际显示效果跟预期的有细微的差别。

  • 相关阅读:
    WPF/MVVM 快速开始指南(译)
    Rose2003的安装和破解
    自定义vs代码段
    silverlight中Grid.ColumnDefinitions属性设置错误
    vs绑定和取消绑定项目和解决方案
    firefox浏览器中silverlight无法输入问题
    silverlight中当前上下文中不存在名称“InitializeComponent“错误
    inotify使用代码
    build android toochain on mac (gcc 4.4.3 compile)
    istat 一个不错的widget
  • 原文地址:https://www.cnblogs.com/hf8051/p/4600329.html
Copyright © 2011-2022 走看看