• php中隐形字符65279(utf-8的BOM头)问题和fwrite写入文件bom头导致的乱码问题解决


     php中隐形字符65279(utf-8的BOM头)问题

    今天在CSDN看到一个php输出空白隐形字符65279的问题,在网上找了下,发下这个65279字符是php用来标记文件是utf-8编码的,输出的时候会一起输出到客户端,导致客户端如果使用ajax得到返回值时,无法匹配字符串。
    php隐形字符65279解释如下:
    UTF-8 编码的文件可以分为无 BOM 和 BOM 两种格式。
    何谓BOM?
      "EF BB BF" 这三个字节就叫BOM,全称是"Byte Order Mard"。在utf8文件中常用BOM来表明这个文件是UTF-8文件,而BOM的本意是在utf16中用。
      utf-8文件在php中输出的时候bom是会被输出的,所以要在php中使用utf-8,必须要是使用不带bom头的utf-8文件。
      常用的文本编辑软件对utf-8文件保存的支持方式并不一样,使用的时候要特别留意。
    例如:
    1、使用ultraedit时,另存时会有“UTF-8”和“UTF-8 - 无BOM”两种选择。
    2、 window的记事本保存的是带bom的。
    3、EditPlus软件不同版本对utf-8的保存支持不一样,例如:2.31版本保存的是不带bom的,2.11版本保存的是带bom的。
    把utf-8文件头去掉的办法:
    1、使用ultraedit另存,选择“UTF-8 - 无BOM”
    2、一个很有用的php程序,放在站点根目录下运行,会把目录下全部utf-8文件的bom头去掉,代码如下:

     1 //remove the utf-8 boms 
     2 //by magicbug at gmail dot com 
     3 
     4 if (isset($_GET['dir'])) { //config the basedir 
     5     $basedir = $_GET['dir'];
     6 } else {
     7     $basedir = '.';
     8 }
     9 
    10 $auto = 1;
    11 
    12 checkdir($basedir);
    13 
    14 function checkdir($basedir)
    15 {
    16     if ($dh = opendir($basedir)) {
    17         while (($file = readdir($dh)) !== FALSE) {
    18             if ($file != '.' && $file != '..') {
    19                 if (!is_dir($basedir . "/" . $file)) {
    20                     echo "filename
    21  $basedir/$file " . checkBOM("$basedir/$file") . " <br>";
    22                 } else {
    23                     $dirname = $basedir . "/" . $file;
    24                     checkdir($dirname);
    25                 }
    26             }
    27         }
    28         closedir($dh);
    29     }
    30 }
    31 
    32 function checkBOM($filename)
    33 {
    34     global $auto;
    35     $contents   = file_get_contents($filename);
    36     $charset[1] = substr($contents, 0, 1);
    37     $charset[2] = substr($contents, 1, 1);
    38     $charset[3] = substr($contents, 2, 1);
    39     if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
    40         if ($auto == 1) {
    41             $rest = substr($contents, 3);
    42             rewrite($filename, $rest);
    43             return ("<font color=red>BOM found, automatically removed.</font>");
    44         } else {
    45             return ("<font color=red>BOM found.</font>");
    46         }
    47     } else return ("BOM Not Found.");
    48 }
    49 
    50 function rewrite($filename, $data)
    51 {
    52     $filenum = fopen($filename, "w");
    53     flock($filenum, LOCK_EX);
    54     fwrite($filenum, $data);
    55     fclose($filenum);
    56 }

    //remove the utf-8 boms
    //by magicbug at gmail dot com

    if (isset($_GET['dir'])) { //config the basedir
    $basedir = $_GET['dir'];
    } else {
    $basedir = '.';
    }

    $auto = 1;

    checkdir($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);
    }
    }

    function checkBOM($filename)
    {
    global $auto;
    $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.");
    }

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

    fwrite写入文件bom头导致的乱码问题解决 

    php fwrite utf8 bom导致的乱码问题

     1 function checkBOM($filename)
     2 {
     3     if (!file_exists($filename)) {
     4         return FALSE;
     5     }
     6     $contents   = file_get_contents($filename);
     7     $charset[1] = substr($contents, 0, 1);
     8     $charset[2] = substr($contents, 1, 1);
     9     $charset[3] = substr($contents, 2, 1);
    10     if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
    11         return TRUE;
    12     }
    13     return FALSE;
    14 }
    15 
    16 $msg = "你好
    ";
    17 //如果默认编码不是utf8,先用函数utf8_encode将所需写入的数据变成UTF编码格式。
    18 //$msg = utf8_encode($msg);
    19 //$msg = iconv('gbk', 'utf-8', $msg);
    20 
    21 $fileName = 'test';
    22 $filePath = './test.txt';
    23 $checkBom = checkBOM($filePath);
    24 // 有bom的情况下"xEFxBBxBF"第一次写入这段字符不可缺少
    25 if ($checkBom == FALSE) {
    26     $msg = "xEFxBBxBF" . $msg;
    27 }
    28 $fp = @fopen($filePath, 'a');
    29 @fwrite($fp, $msg);
    30 @fclose($fp);

    function checkBOM($filename)
    {
    if (!file_exists($filename)) {
    return FALSE;
    }
    $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) {
    return TRUE;
    }
    return FALSE;
    }

    $msg = "你好 ";
    //如果默认编码不是utf8,先用函数utf8_encode将所需写入的数据变成UTF编码格式。
    //$msg = utf8_encode($msg);
    //$msg = iconv('gbk', 'utf-8', $msg);

    $fileName = 'test';
    $filePath = './test.txt';
    $checkBom = checkBOM($filePath);
    // 有bom的情况下"xEFxBBxBF"第一次写入这段字符不可缺少
    if ($checkBom == FALSE) {
    $msg = "xEFxBBxBF" . $msg;
    }
    $fp = @fopen($filePath, 'a');
    @fwrite($fp, $msg);
    @fclose($fp);

  • 相关阅读:
    SOJ 4580 动态规划之01背包 (01背包)
    文件比较与同步工具——FreeFileSync
    肺结节CT影像特征提取(五)——肺结节CT影像ROI区域灰度直方图及其图形化
    JAVA学习笔记(4)—— 排序算法
    JAVA学习笔记(3)—— 抽象类与接口
    JAVA学习笔记(2)—— java初始化三个原则
    JAVA学习笔记(1)—— eclipse自动补全和主题及字体配置
    3D Slicer中文教程(八)—导出STL文件
    3D Slicer中文教程(七)—图像中值滤波
    “Excel-建议不可用于您所选择的数据”错误提示
  • 原文地址:https://www.cnblogs.com/zqifa/p/php-25.html
Copyright © 2020-2023  润新知