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);
如果觉得这文章还算用心,请劳驾点击右下角的推荐,这是对我们这些做开源分享的最大的肯定,谢谢。
作者:zqifa
出处:https://www.cnblogs.com/zqifa/
欢迎访问新博客地址:https://www.l1mn.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。