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 = "你好\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($filePath);
24 // 有bom的情况下"\xEF\xBB\xBF"第一次写入这段字符不可缺少
25 if ($checkBom == FALSE) {
26     $msg = "\xEF\xBB\xBF" . $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 = "你好\n";
//如果默认编码不是utf8,先用函数utf8_encode将所需写入的数据变成UTF编码格式。
//$msg = utf8_encode($msg);
//$msg = iconv('gbk', 'utf-8', $msg);

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

 

posted on 2017-02-06 11:26  zqifa  阅读(1741)  评论(0编辑  收藏  举报

导航