找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1768|回复: 0
打印 上一主题 下一主题

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

[复制链接]

2617

主题

2617

帖子

7789

积分

论坛元老

Rank: 8Rank: 8

积分
7789
跳转到指定楼层
楼主
发表于 2018-2-14 05:55:35 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

            今天在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")."
";
         }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 ("
BOM found, automatically removed.
");
     } else {
       return ("
BOM found.
");
     }
   }
   else return ("BOM Not Found.");
}
  
function rewrite ($filename, $data) {
   $filenum = fopen($filename, "w");
   flock($filenum, LOCK_EX);
   fwrite($filenum, $data);
   fclose($filenum);
}
            
            
您可能感兴趣的文章:
  • php utf-8转unicode的函数
  • jq的get传参数在utf-8中乱码问题的解决php版
  • php中utf-8编码下用正则表达式如何匹配汉字
  • PHP 截取字符串函数整理(支持gb2312和utf-8)
  • PHP iconv 解决utf-8和gb2312编码转换问题
  • php UTF-8、Unicode和BOM问题
  • php smarty截取中文字符乱码问题?gb2312/utf-8
  • PHP乱码问题,UTF-8乱码常见问题小结
  • PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
  • php中文乱码怎么办如何让浏览器自动识别utf-8
  • php中json_encode UTF-8中文乱码的更好解决方法
  • PHP如何实现Unicode和Utf-8编码相互转换
  • PHP 与 UTF-8 的最佳实践详细介绍
            
  • 分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    用户反馈
    客户端