1 <meta http-equiv="content-type" content="text/html; charset=編碼類型">作用是:聲明客戶端的瀏覽器用什么字符集編碼顯示該頁面,起到通知瀏覽器的作用。只有字符編碼與瀏覽器編碼相同時才不會造成錯誤而產(chǎn)生亂碼。二、采用header()頁面編碼用header()來設(shè)置頁面編碼
1 header("content-type:text/html; charset=編碼類型");header是發(fā)送原始 HTTP 標(biāo)頭,作用是把括號里面的信息發(fā)到http標(biāo)頭,瀏覽器會采用header()中設(shè)置的編碼。三、AddDefaultCharset方式設(shè)置編碼 注意:以前版本的Apache配置時修改AddDefaultCharset這個選項,要改為gb2312或者utf-8,否則漢字會變?yōu)閬y碼,但從Apache 2.0.53 開始,取消了AddDefaultCharset,現(xiàn)在的新版本會自適應(yīng)瀏覽器的。所以在apache2.4中是找不到AddDefaultCharset的。文檔中:
1:如果頁面沒有指定編碼, Apache配置defaultcharset gbk , 頁面文件編碼是utf-8。
頁面顯示是亂碼。在頁面沒有meta指明charset,設(shè)置defaultcharset gbk,這個時候服務(wù)器的設(shè)置生效,編碼不一致,造成亂碼;
2:如果頁面指定編碼為utf-8, Apache配置defaultcharset gbk. 頁面文件編碼是utf-8。
頁面顯示亂碼。設(shè)置defaultcharset gbk,會覆蓋頁面級別(meta)的編碼設(shè)置;
3:如果頁面header申明charset為utf8, Apache配置defaultcharst gbk,頁面文件編碼是utf8。
頁面顯示正常。這個說明header優(yōu)先級要高于服務(wù)器和瀏覽器的設(shè)置;
4:如果Apache關(guān)閉DefaultCharset 。
頁面顯示正常。
由此得出結(jié)論: header() >>AddDefaultCharset >> meta 所以添加header()是比較好的方法四、編碼轉(zhuǎn)換函數(shù)1:mb_detect_encoding 檢查編碼1 $string = "趙亞飛";2 $encode = mb_detect_encoding($string, array("ASCII","UTF-8","GB2312","GBK","BIG5"));3 header("content-Type: text/html; charset=".$encode);4 echo $string;
有時會出現(xiàn)檢查錯誤(解決辦法)例如:對與GB2312和UTF- 8,或者UTF-8和GBK網(wǎng)上說是由于字符短是,mb_detect_encoding會出現(xiàn)誤判。不是bug,寫程序時也不應(yīng)當(dāng)過于依賴mb_detect_encoding,當(dāng)字符串較短時,檢測結(jié)果產(chǎn)生偏差的可能性很大。
$encode = mb_detect_encoding($keytitle, array('ASCII','GB2312′,'GBK','UTF-8');三個參數(shù)分別是:被檢測的輸入變量、編碼方式的檢測順序(如果為真,后面自動忽略)、strict模式1 1: 將任意類型( 'ASCII,GB2312,GBK,UTF-8')字符串$html_str轉(zhuǎn)換成'UTF-8'編碼2 $html_str = mb_convert_encoding($html_str, 'UTF-8', 'ASCII,GB2312,GBK,UTF-8');3 2:gbk To utf-84 < ?php 5 header("content-Type: text/html; charset=Utf-8"); 6 echo mb_convert_encoding("趙亞飛", "UTF-8", "GBK"); 7 ?>
注意:使用上面的函數(shù)需要安裝但是需要先enable mbstring 擴展庫。在 php.ini里將; extension=php_mbstring.dll 前面的 ;去掉
mb_convert_encoding 可以指定多種輸入編碼,它會根據(jù)內(nèi)容自動識別,;執(zhí)行效率比iconv差很多3:iconv轉(zhuǎn)換編碼iconv函數(shù)庫能夠完成各種字符集間的轉(zhuǎn)換,是php編程中不可缺少的基礎(chǔ)函數(shù)庫。1 iconv("UTF-8","GB2312//IGNORE",$data)ignore意思是忽略轉(zhuǎn)換時的錯誤,如果沒有ignore參數(shù),所有該字符后面的字符串都無法被保存(不往下進(jìn)行轉(zhuǎn)換)。iconv不是php的默認(rèn)函數(shù),也不是默認(rèn)安裝的模塊。需要安裝才能用的。這里有一個自動判斷編碼類型,進(jìn)行轉(zhuǎn)化的函數(shù):
1 function check_encod($encod,$string){ 2 //判斷字符編碼 3 $encode = mb_detect_encoding($string, array("ASCII","UTF-8","GB2312","GBK","BIG5")); 4 var_dump($encode); 5 if($encode != $encod){ 6 $string = iconv($encode, $encod, $string); 7 } 8 return $string; 9 }10 $path = "趙亞飛。.jpg";11 $path = check_encod("GB2312",$path);五:字符串截取1:mb_substr() PHP substr()函數(shù)可分割文字,但分割的文字如果包括中文字符往往會遇到問題,這時可以用mb_substr()這個函 數(shù),用法與substr()相似,只是在mb_substr()最后要加入多一個參數(shù),以設(shè)定字符串的編碼,需要打開php_mbstring.dll,需要在php.ini中把php_mbstring.dll打開。例如:
1 echo mb_substr('趙亞飛趙亞飛er',0,9); //輸出:趙亞飛2 echo mb_substr('趙亞飛趙亞飛er',0,9,'utf-8'); //輸出:趙亞飛趙亞飛er
第一個是以三個字節(jié)為一個中文,這就是utf-8編碼的特點,下面加上utf-8字符集說明,是以一個字為單位來截取的
2:iconv_substr()Substr是截取字符的函數(shù),但是很多時候,截取中文卻需要額外處理,原因是中文在UTF-8中占用3個字節(jié),在GB2312中占用2個字節(jié),在截取中隨時存在截取的字符串長度與組成未知,所以給很多人造成了困擾。PHP5開始,iconv_substr函數(shù)出現(xiàn)
1 <?php2 $str='趙z亞y飛f/include'; 3 echo substr($str,1,5);4 echo "<br>";5 echo iconv_substr($str,1,5,"UTF-8"); 6 ?>
這個是在網(wǎng)頁編碼為UTF-8的PHP代碼中使用的截取編碼。如果在UTF-8網(wǎng)頁中使用GB2312或者GBK編碼來截取,會出錯,占用字節(jié)不同;反之,在GB2312或GBK網(wǎng)頁中,不能使用UTF-8來進(jìn)行截取 。由于iconv_substr是按照字符而非占用字節(jié)來計算,所以“a”和“葉”均計算為1位。在GB2312或者GBK中,由于占用字節(jié)是一樣的,所以可以隨意使用GB2312或GBK編碼來截取,截取結(jié)果是一樣的。
1 function msub_str($str, $start=0, $length, $charset="utf-8", $suffix=true){ 2 if(function_exists("mb_substr")) 3 return mb_substr($str, $start, $length, $charset); 4 else if(function_exists('iconv_substr')) { 5 return iconv_substr($str,$start,$length,$charset); 6 } 7 $re['utf-8'] = "/[/x01-/x7f]|[/xc2-/xdf][/x80-/xbf]|[/xe0-/xef][/x80-/xbf]{2}|[/xf0-/xff][/x80-/xbf]{3}/"; 8 $re['gb2312'] = "/[/x01-/x7f]|[/xb0-/xf7][/xa0-/xfe]/"; 9 $re['gbk'] = "/[/x01-/x7f]|[/x81-/xfe][/x40-/xfe]/";10 $re['big5'] = "/[/x01-/x7f]|[/x81-/xfe]([/x40-/x7e]|/xa1-/xfe])/";11 preg_match_all($re[$charset], $str, $match);12 $slice = join("",array_slice($match[0], $start, $length));13 if($suffix) {14 return $slice."…";15 }16 return $slice;17 }PHP編程
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
新聞熱點
疑難解答
圖片精選