apache+php 字符編碼問題解決問題: 如果你在網(wǎng)上搜索 “apache配置”,搜到的頁面大多都會建議你在httpd.conf中加上這么一句:AddDefaultCharset GB2312。對于新手而且是只用GB2312編碼的開發(fā)人來說,這么做是ok的。 但是如果要想使用UTF-8字符集的話,比如 在test.php文件中需要有 所以說如果apache的默認(rèn)字符集被設(shè)置成了GB2312,即使在頁面中聲明使用UTF-8編碼,apache服務(wù)器還是會按照GB2312編碼來傳送http response。 沒 關(guān)系,我們把AddDefaultCharset GB2312 改成 AddDefaultCharset UTF-8,看看什么結(jié)果?如果你看到亂碼恭喜你,你還知道是亂碼問題;如果你看到是空白頁面,那么你就慘了,你可能會以為這是其他什么原因造成的,而不 會從編碼的角度去考慮怎么解決問題。這是為什么? 原因在于php文件本身是用系統(tǒng)字符集來編碼的,中文的windows XP都是用GB2312,每一個文件頭部都有字段指示該文件是用何種方式編碼的。當(dāng)apache接到瀏覽器的請求后,會讓php去解釋所請求的頁面,比如 test.php。php會識別出test.php的編碼方式是GB2312后(就像我們用javac編譯java源文件時,編譯器默認(rèn)用系統(tǒng)編碼讀源文 件里的內(nèi)容。如果源文件不是用系統(tǒng)編碼來保存的,可以用命令javac -encoding指定具體的編碼),把數(shù)據(jù)以GB2312的編碼格式傳遞給apache,而apache服務(wù)器不會改變從php傳來的數(shù)據(jù),只是在應(yīng)答 消息頭部中把字符集設(shè)置成UTF-8: Content-type: text/html; charset=UTF-8. 也就是說你傳遞的是GB2312編碼的數(shù)據(jù),而瀏覽器卻以UTF-8編碼來解釋應(yīng)答消息。 由 于UTF-8為3個字節(jié)表示一個漢子,而普通的GB2312或BIG5是兩個。頁面輸出時,由于上述原因,出現(xiàn)半個漢字的情況,這時該半個漢字會和的 >結(jié)合成一個亂碼字,導(dǎo)致IE無法讀完的話,會發(fā)現(xiàn)實(shí)際上整個葉面全部已經(jīng)輸出了。如果使用的是Mozilla、Mozilla Firefox、Sarafi的瀏覽器這不會造成這個問題,而是一堆亂碼。這是由于Firefox瀏覽器和IE解析網(wǎng)頁編碼的策略不同產(chǎn)生的。 OK,我們把test.php以UTF-8保存,再用瀏覽器訪問時,就沒有問題了。可這樣做,會使得apache目錄下的所有web應(yīng)用只能用同一種編碼。如何搞定? 首先,可以使用AddDefaultCharset off來 關(guān)閉默認(rèn)文件編碼,這樣apache服務(wù)器就不會在http應(yīng)答消息頭部設(shè)置charset,只是設(shè)置Content-type: text/html. 而瀏覽器就會依靠html文件中設(shè)置的harset來決定編碼。其次,腳本php.ini文件中的default_charset = “UTF-8″作用同httpd.conf文件,把該行注釋掉,使php自動識別文件的編碼方式。 這樣不論你用什么編碼方式,只要test.php中的 用戶提交數(shù)據(jù)的編碼 瀏 覽器提交的字符編碼由客戶端的characher encoding決定。例如,當(dāng)前瀏覽器的編碼是Gb2312,用戶提交數(shù)據(jù)后,無論apache設(shè)置的編碼方式是GB2312還是UTF-8,這時在服 務(wù)器端接收到的仍是以Gb2312編碼的數(shù)據(jù)。如果要在返回頁面上顯示用戶剛才提交的數(shù)據(jù),而該頁面是用UTF-8編碼,或者要在數(shù)據(jù)庫中存儲的用戶提交 的數(shù)據(jù),而數(shù)據(jù)庫是UTF-8編碼的,那就要做字符轉(zhuǎn)換了。 |
|