zoukankan      html  css  js  c++  java
  • 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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    //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);
    }

     

  • 相关阅读:
    JAVA 面向对象的扩展 内部类
    对于win10 更换JDK后 查询JDK路径还是原路径的解决办法
    懂得的懂
    稀疏数组转化二维数组
    Flume的安装配置
    CentOS7配置ip和ssh免密登录和hadoop环境
    AOP的使用和事务
    spring的个人理解
    单车月结算2-修改和删除功能
    单车月结算1
  • 原文地址:https://www.cnblogs.com/myzsy/p/6369596.html
Copyright © 2011-2022 走看看