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

5年以前  |  阅读数:554 次  |  编程语言:PHP 

今天在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头去掉,代码如下:


    //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); 
    } 
 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例