加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php中隐形字符65279(utf-8的BOM头)问题和fwrite写入文件bom头

发布时间:2020-12-13 21:21:59 所属栏目:PHP教程 来源:网络整理
导读:?php中隐形字符65279(utf-8的BOM头)问题 今天在CSDN看到一个php输出空白隐形字符65279的问题,在网上找了下,发下这个65279字符是php用来标记文件是utf-8编码的,输出的时候会一起输出到客户端,导致客户端如果使用ajax得到返回值时,无法匹配字符串。 php

?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 = 111 
12 checkdir($basedir);
13 
14 function checkdir()
15 {
16     if ($dh = opendir()) {
17         while (($file = readdir($dh)) !== FALSE) {
18             $file != '.' && $file != '..'19                 if (!is_dir($basedir . "/" . $file20                     echo "filename
21  $basedir/$file " . checkBOM("$file") . " <br>"22                 } 23                     $dirname = 24                     checkdir($dirname25                 }
26             }
27         }
28         closedir($dh29     }
30 31 
32 function checkBOM($filename33 34     global $auto35     $contents   = file_get_contents(36     $charset[1] = substr($contents,137     $charset[2] = 38     $charset[3] = 39     ord($charset[1]) == 239 && $charset[2]) == 187 && $charset[3]) == 19140         $auto == 141             $rest = 42             rewrite($filename,$rest43             return ("<font color=red>BOM found,automatically removed.</font>"44         } 45             return ("<font color=red>BOM found.</font>"46 47     } else return ("BOM Not Found."48 49 
50 function rewrite($data51 52     $filenum = fopen(53     flock($filenum, LOCK_EX);
54     fwrite(55     fclose($filenum56 }

?

?

//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,1);
$charset[2] = substr($contents,1);
$charset[3] = substr($contents,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导致的乱码问题

?

 3     file_exists( 4         return  5  6      8      9     10     11         TRUE12 13     15 
16 $msg = "你好n"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($filePath24  有bom的情况下"xEFxBBxBF"第一次写入这段字符不可缺少
$checkBom == 26     $msg = "xEFxBBxBF" . $msg28 $fp = @$filePath,'a'29 @$fp,1)">30 @$fp);

?

function checkBOM($filename)
{
if (!file_exists($filename)) {
return FALSE;
}
$contents = file_get_contents($filename);
$charset[1] = substr($contents,1);
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
return TRUE;
}
return FALSE;
}

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

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读