Ⅰ 如何使用php批量去除文件UTF8 BOM信息
原理:
UTF8文件,微軟為了增加一個識別信息,有了BOM這個東西:BOM —— Byte Order Mark,預設在Windows等平台上編輯的UTF8文件會在頭部增加3個位元組的標記信息,我們PHP引擎在處理的時候會完整讀取整個PHP代碼文檔, 如果PHP文件頭部包含BOM信息,就會輸出一個空白,在很多時候會帶來問題,比如我們session無法工作、cookie無法設置等等問題。
解決方法:
把頭部BOM的3個位元組信息識別出來,然後剔除掉。不過一般情況我們不知道哪個文件有BOM,或者是有很多文件,這個時候,就需要進行批量處理了,下面代碼主要就是展現了批量處理的情況,應該會對大家工作中有幫助。
執行方法:
設置一個路徑,然後直接執行就行。
復制代碼 代碼如下:
<?php
// 設定你要清除BOM的根目錄(會自動掃描所有子目錄和文件)
$HOME = dirname(__FILE__);
// 如果是Windows系統,修改為:$WIN = 1;
$WIN = 0;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>UTF8 BOM 清除器</title>
<style>
body { font-size: 10px; font-family: Arial, Helvetica, sans-serif; background: #FFF; color: #000; }
.FOUND { color: #F30; font-size: 14px; font-weight: bold; }
</style>
</head>
<body>
<?php
$BOMBED = array();
RecursiveFolder($HOME);
echo '<h2>These files had UTF8 BOM, but i cleaned them:</h2><p class="FOUND">';
foreach ($BOMBED as $utf) { echo $utf ."<br />n"; }
echo '</p>';
// 遞歸掃描
function RecursiveFolder($sHOME) {
global $BOMBED, $WIN;
$win32 = ($WIN == 1) ? "" : "/";
$folder = dir($sHOME);
$foundfolders = array();
while ($file = $folder->read()) {
if($file != "." and $file != "..") {
if(filetype($sHOME . $win32 . $file) == "dir"){
$foundfolders[count($foundfolders)] = $sHOME . $win32 . $file;
} else {
$content = file_get_contents($sHOME . $win32 . $file);
$BOM = SearchBOM($content);
if ($BOM) {
$BOMBED[count($BOMBED)] = $sHOME . $win32 . $file;
// 移出BOM信息
$content = substr($content,3);
// 寫回到原始文件
file_put_contents($sHOME . $win32 . $file, $content);
}
}
}
}
$folder->close();
if(count($foundfolders) > 0) {
foreach ($foundfolders as $folder) {
RecursiveFolder($folder, $win32);
}
}
}
// 搜索當前文件是否有BOM
function SearchBOM($string) {
if(substr($string,0,3) == pack("CCC",0xef,0xbb,0xbf)) return true;
return false;
}
?>
</body>
</html>
望採納。
Ⅱ php utf-8 bom問題
1. 可用UE(Ultra Edit)的ASCII模式編輯, 把"<"前面的三個字元去掉.
2. 或者用下面PHP代碼保存成del_bom.php, 放到config.php文件同目錄執行(先備份後操作)
<?php
function remove_bom($string) {
if(substr($string, 0,3) == pack("CCC",0xef,0xbb,0xbf)) {
$string = substr($string, 3);
}
return $string;
}
$file = 'a.php'; // 你的文件名
$str = file_get_contents($file);
$str = remove_bom($str);
file_put_contents($file, $str);
Ⅲ 如何解決PHP在utf-8編碼下中文顯示亂碼問題
如果php文件已經在頭部設置編碼格式為utf-8,在運行的時候還出現亂碼問題,可能是由於文件編碼格式不匹配或者頭部有bom信息輸出導致亂碼。解決辦法:
設置保存文件編碼格式為utf-8;
去掉文件頭部bom信息;
Ⅳ 什麼是BOM頭,及PHP解決辦法
類似WINDOWS自帶的記事本等軟體,在保存一個以UTF-8編碼的文件時,會在文件開始的地方插入三個不可見的字元(0xEF 0xBB 0xBF,即BOM)。它是一串隱藏的字元,用於讓記事本等編輯器識別這個文件是否以UTF-8編碼。對於一般的文件,這樣並不會產生什麼麻煩。但對於 PHP來說,BOM是個大麻煩。
PHP並不會忽略BOM,所以在讀取、包含或者引用這些文件時,會把BOM作為該文件開頭正文的一部分。根據嵌入式語言的特點,這串字元將被直接執行(顯示)出來。由此造成即使頁面的 top padding 設置為0,也無法讓整個網頁緊貼瀏覽器頂部,因為在html一開頭有這3個字元呢!
window編輯器如果保存為utf8文件就會幫你加上BOM頭,以告訴其他編輯器以utf8來顯示字元
但是在網頁上並不需要添加BOM頭識別,因為網頁上可以使用 head頭 指定charset=utf8告訴瀏覽器用utf8來解釋.但是你用window自動的編輯器,編輯,然後有顯示在網頁上這樣就會顯示出0xEF 0xBB 0xBF這3個字元。
這樣網頁上就需要去除0xEF 0xBB 0xBF,可以使用editplus 選擇不帶BOM的編碼,這樣就可以去除了
php去除BOM頭:
復制代碼
function rmBOM($string)
{
if (substr($string, 0,3) == pack('CCC',0xef,0xbb,0xbf))
{
$string = substr($string, 3);
}
return $string;
}
Ⅳ php怎麼解析utf-8帶BOM編碼的json數據,php解析json數據返回NULL
son_decode函數能夠接收utf8編碼的參數,但是當參數中包含BOM時,json_decode就會失效。
這個函數能將給定的字元串轉換成UTF-8編碼,移除其中的BOM。
下面是PHP代碼:
function prepareJSON($input) {
//This will convert ASCII/ISO-8859-1 to UTF-8.
//Be careful with the third parameter (encoding detect list), because
//if set wrong, some input encodings will get garbled (including UTF-8!)
$imput = mb_convert_encoding($input, 'UTF-8', 'ASCII,UTF-8,ISO-8859-1');
//Remove UTF-8 BOM if present, json_decode() does not like it.
if(substr($input, 0, 3) == pack("CCC", 0xEF,
Ⅵ 用utf-8編碼php文件時,我們可以選擇以(utf-8編碼格式)還是以(utf-8無BOM編碼格式)
保存時,使用UTF-8 無BOM編碼格式。
php在處理BOM頭的時候,有時候存在錯誤,可能造成你在使用 header 或 session_start 之類的函數時,出現 文件已經輸出的錯誤,多數都是因為BOM頭送出去了。。因為在php看來,成了一個空格。所以使用無BOM的格式!
Ⅶ PHP程序UTF8無BOM的問題,請高手賜教
第一,BOM是不會影響你顯示的繹碼的……
如果你手動繹碼後,能正常 。那是因為你沒在你的文件指定字元串編碼
header("Content-type:text/html;charset=utf8");在PHP文件開頭加上這句
Ⅷ PHP批量刪除、清除UTF-8文件BOM頭的代碼實例
記得運行代碼前先把文件備份一下哦,避免出現失敗問題。
代碼一:
復制代碼
代碼如下:
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.");
}
代碼二:
復制代碼
代碼如下:
<?php
header('content-Type:
text/html;
charset=utf-8');
if(isset($_GET['dir'])){
//設置文件目錄,如果沒有設置,則自動設置為當前文件所在目錄
$basedir=$_GET['dir'];
}else{
$basedir='.';
}
$auto=1;/*設置為1標示檢測BOM並去除,設置為0標示只進行BOM檢測,不去除*/
echo
'當前查找的目錄為:'.$basedir.'當前的設置是:';
echo
$auto?'檢測文件BOM同時去除檢測到BOM文件的BOM<br
/>':'只檢測文件BOM不執行去除BOM操作<br
/>';
checkdir($basedir);
function
checkdir($basedir){
if($dh=opendir($basedir)){
while
(($file=readdir($dh))
!==
false){
if($file
!=
'.'
&&
$file
!=
'..'){
if(!is_dir($basedir.'/'.$file)){
echo
'文件:
'.$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並已自動去除</font>');
}else{
return
('
<font
color=red>找到BOM</font>');
}
}else{
return
('
沒有找到BOM');
}
}
function
rewrite($filename,$data){
$filenum=fopen($filename,'w');
flock($filenum,LOCK_EX);
fwrite($filenum,$data);
fclose($filenum);
}
?>
Ⅸ php文件轉為有bom頭utf8編碼不亂碼,轉為無bom頭utf8亂碼
PHP的介紹
PHP,是英文超文本預處理語言Hypertext Preprocessor的縮寫。PHP 是一種可以 HTML 內嵌式的語言,是一種在伺服器端執行的嵌入HTML文檔的腳本語言,語言的風格有類似於C語言,被廣泛地運用。自從PHP5開始,引入了面向對象的全部機制,並且保留了向下兼容性。
PHP的發展歷史
PHP原始為Personal Home Page的縮寫,現已經正式更名為 「PHP: Hypertext Preprocessor」的縮寫。注意不是「Hypertext Preprocessor」的縮寫,這種將名稱放到定義中的寫法被稱作遞歸縮寫。PHP於1994年由Rasmus Lerdorf創建,剛剛開始是Rasmus Lerdorf 為了要維護個人網頁而製作的一個簡單的用Perl語言編寫的程序。最初這些工具程序用來顯示 Rasmus Lerdorf 的個人履歷,以及統計網頁流量。後來又用C語言重新編寫,包括可以訪問資料庫。他將這些程序和一些表單直譯器整合起來,稱為 PHP/FI。PHP/FI 可以和資料庫連接,產生簡單的動態網頁程序。
PHP的現狀
PHP作為最成熟的開源體系LAMP(Linux,Apache,MySQL,PHP)的重要一員,以其簡單性、開放性、低成本、安全性和適用性,受到越來越多的Web程序員的歡迎和喜愛。
PHP中提供了作為編碼語言所有的基本功能。此外,它還提供許多實用的功能,使得PHP比其他編程語言更適合動態網頁的開發。針對企業級Web應用,PHP也不斷地完善和增加新的功能。
PHP是開放源代碼的,這意味著其代碼的核心部分可以被免費使用。所有源碼、文檔可以在PHP官方網站上獲得。用戶可以自由復制、編譯、分發其拷貝。任何一個用PHP編寫的程序都屬於用戶自己,並且可以自行處理。
正式由於這種開源精神,才使PHP社區可以聚集眾多的愛好者,也使得PHP有如此迅猛的發展。PHP的更新速度,以及發現和修正錯誤的速度是非常迅速的。可以看到,幾乎每周都有一個新版本的PHP程序包發布。
目前,PHP的官方維護者和推動者Zend公司已經加快了PHP企業級應用的步伐。隨著PHP5的應用不斷擴大,Zend公司還將推出一個標準的PHP開發框架Zend Framework。通過這一框架,PHP開發者可以快速地構建Web應用。
PHP還具有優秀的平台兼容性。PHP源於UNIX系統平台,尤其是PHP、MySQL、 Apache和Linux組合,備受PHP愛好者的歡迎。不僅如此,PHP在Windows系列操作系統上也有出色的表現。其良好的程序界面、語言易用性等特點吸引了微軟的開發人員。目前,有消息稱未來的Windows . NET開發環境將集成PHP,這也意味著PHP的用戶群將日益壯大。
PHP是廣泛及通用的腳本語言,它尤其適合於Web開發。PHP是世界上主要的網路開發語言之一,運行在世界三分之一的伺服器上。它是從雅虎到Facebook等公司的平台選擇,也是共享主機上最廣泛的開發平台,為世界上數百萬的網站提供動力。
今天,已經有包括雅虎和亞馬遜等在內的數百萬網站,以及眾多的開發人員和編程愛好者正在使用PHP。從最初的PHP/FI到現在的PHP5,PHP的發展是及其迅猛的,其未來的發展前景也必定令人矚目。
隨著PHP5版本性能的提升,以及面向對象功能的完善,PHP也逐漸開始於面向企業級應用。PHP的發展前景將無限廣闊。
現在php5的最新版本為php5.4.3,較php5.3增強了安全特性,去掉了一些威脅安全的函數如global_register等,去掉了安全模式。
PHP的特點
PHP 獨特的語法混合了 C、Java、Perl 以及 PHP 自創新的語法。
PHP安裝它可以比 CGI或者Perl更快速的執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成htmL標記的CGI要高許多;
PHP還可以執行編譯後代碼,編譯可以達到加密和優化代碼運行,使代碼運行更快。
PHP具有非常強大的功能,所有的CGI的功能PHP都能實現,而且支持幾乎所有流行的資料庫以及操作系統。
最重要的是PHP可以用C、C++進行程序的擴展!
PHP的優勢
開放的源代碼:所有的PHP源代碼事實上都可以得到。
PHP是免費的:和其它技術相比,PHP本身免費且是開源代碼。
php的快捷性:程序開發快,運行快,技術本身學習快。嵌入於HTML:因為PHP可以被嵌入於HTML語言,它相對於其他語言。編輯簡單,實用性強,更適合初學者。
跨平台性強:由於PHP是運行在伺服器端的腳本,可以運行在UNIX、LINUX、WINDOWS、Mac OS下。
效率高:PHP消耗相當少的系統資源。
圖像處理:用PHP動態創建圖像,PHP圖像處理默認使用GD2。不過也可以配置為使用image magick進行圖像處理。
面向對象:在php4,php5 中,面向對象方面都有了很大的改進,php完全可以用來開發大型商業程序。
專業專註:PHP支持腳本語言為主,同為類C語言
Ⅹ 怎麼讓文件中的內容以utf8編碼正常顯示到php頁面
輸出的內容前面加上utf-8頭部即可。
//輸出數據到excel/txt文件
$fileName=date("YmdHis")."_data.txt";
//chr(0xEF).chr(0xBB).chr(0xBF)設置文件的bom,utf-8輸出。
file_put_contents($fileName,chr(0xEF).chr(0xBB).chr(0xBF).$content);