亂碼一直是困擾PHP初學(xué)者的一個非常大的問題,現(xiàn)在總結(jié)下造成亂碼的原因及解決方法:
成都創(chuàng)新互聯(lián)長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為烈山企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站制作,烈山網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
一、HTML頁面編碼:meta http-equiv=content-type content=text/html; charset=utf-8 這里的編碼要和數(shù)據(jù)庫編碼,及連接數(shù)據(jù)庫編碼;
二、文件在存儲編碼:比如文件inde.php,改變其存儲編碼為所需編碼。只需用EditPlus等文本編輯軟件 文件另存為,在編碼中選擇正確的編碼(這點很多人都會忽略);
三、數(shù)據(jù)庫編碼:比如用的是phpmyadmin 選擇數(shù)據(jù)庫后,選擇操作選項。下面有一個整理,這里面也要設(shè)置成統(tǒng)一的編碼;
四、表編碼:操作和第三點類似。這里就不重復(fù)了;
五、字段編碼:在建表的建字段的時候,有個整理。如果內(nèi)容有漢字,就一定要改成統(tǒng)一的編碼;
六、連接數(shù)據(jù)庫時mysql_select_db()后面,要加一句 mysql_query( set names utf8 );
七、 (剛遇到的)本地測試成功后的網(wǎng)站,傳到網(wǎng)上去,會有亂碼??赡軙窃诒镜貙?dǎo)出數(shù)據(jù)時沒有選擇正確的編碼,所以才會在導(dǎo)入到web上后有亂碼問題。
access的中文版默認(rèn)是GBK格式的,是無法改變字符類型的,所以用php讀取的時候會亂碼。
解決方法是:使用iconv轉(zhuǎn)換
一、使用 iconv函數(shù)制作一個轉(zhuǎn)碼的自定義從GBK轉(zhuǎn)到UTF-8的函數(shù),如以下代碼:
function enc($c){return iconv('gbk','utf-8',$c);}
二、為了寫入數(shù)據(jù)庫的編碼是符合數(shù)據(jù)庫需要的,所以我們還要制作一個從UTF-8轉(zhuǎn)向GBK的函數(shù):
function dec($c){return iconv('utf-8','gb2312',$c);}
制作好了轉(zhuǎn)碼函數(shù),接下就是正常使用了。在從數(shù)據(jù)庫里面調(diào)數(shù)據(jù)顯示在頁面的時候使用enc()函數(shù),從頁面提交數(shù)據(jù)到數(shù)據(jù)庫時使用dec()函數(shù),這樣就可以很好的解決PHP使用UTF-8編碼,ACCESS使用系統(tǒng)默認(rèn)編碼的問題了。
數(shù)據(jù)庫采用UTF8編碼,而頁面申明編碼是GB2312,這是最常見的產(chǎn)生亂碼的原因。這時候在PHP腳本里面直接SELECT數(shù)據(jù)出來的就是亂碼,需要在查詢前先使用:mysql_query("SET NAMES GBK");或mysql_query("SET NAMES GB2312");來設(shè)定MYSQL連接編碼,保證頁面申明編碼與這里設(shè)定的連接編碼一致(GBK是GB2312的擴展)。如果頁面是UTF-8編碼的話,可以用:mysql_query("SET NAMES UTF8"); 注意是UTF8而不是一般用的UTF-8。假如頁面申明的編碼與數(shù)據(jù)庫內(nèi)部編碼一致可以不設(shè)定連接編碼。
事實上MYSQL配置文件my.ini中定義了2個默認(rèn)編碼,分別是[client]里的default-character-set和[mysqld]里的default-character-set來分別設(shè)定默認(rèn)時候客戶端連接和數(shù)據(jù)庫內(nèi)部所采用的編碼。上面指定的編碼其實是MYSQL客戶端連接服務(wù)器時候的命令行參數(shù)character_set_client,來告訴MYSQL服務(wù)器接受到的客戶端數(shù)據(jù)是什么編碼的,而不是采用默認(rèn)編碼。
轉(zhuǎn)自:
編碼問題,請主要檢查內(nèi)容有:
①涉及文件的編碼
②php的編碼
③html的編碼
無論是用utf-8還是gbk,請先保證以上三點統(tǒng)一,一般就可以解決問題。
最后如果還是不行的話,說明可能PHP字符本身就是亂碼,此時就應(yīng)該檢查數(shù)據(jù)庫或者服務(wù)器傳遞出來的值的格式。