apache與php亂碼

來源:互聯網
上載者:User

如果你在網上搜尋 “apache配置”,搜到的頁面大多都會建議你在httpd.conf中加上這麼一句:AddDefaultCharset GB2312。對於新手而且是只用GB2312編碼的開發人來說,這麼做是ok的。

但是如果要想使用UTF-8字元集的話,比如 在test.php檔案中需要有
meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″
這段代碼。這時你再開啟瀏覽器訪問test.php頁面的話,你看到的是正確的頁面。但是如果實際上瀏覽器還是以GB2312編碼解釋從伺服器返回的response,為什麼呢?原因是瀏覽器是根據http應答訊息頭部中的 Content-type: text/html; charset=GB2312 來決定使用何種編碼解釋應答,也就是說apache伺服器仍然用GB2312編碼傳遞資料。

所以說如果apache的預設字元集被設定成了GB2312,即使在頁面中聲明使用UTF-8編碼,apache伺服器還是會按照GB2312編碼來傳送http response。

沒 關係,我們把AddDefaultCharset GB2312 改成 AddDefaultCharset UTF-8,看看什麼結果?如果你看到亂碼恭喜你,你還知道是亂碼問題;如果你看到是空白頁面,那麼你就慘了,你可能會以為這是其他什麼原因造成的,而不 會從編碼的角度去考慮怎麼解決問題。這是為什嗎?

原因在於php檔案本身是用系統字元集來編碼的,中文的windows XP都是用GB2312,每一個檔案頭部都有欄位指示該檔案是用何種方式編碼的。當apache接到瀏覽器的請求後,會讓php去解釋所請求的頁面,比如 test.php。php會識別出test.php的編碼方式是GB2312後(就像我們用javac編譯java源檔案時,編譯器預設用系統編碼讀源文 件裡的內容。如果源檔案不是用系統編碼來儲存的,可以用命令javac -encoding指定具體的編碼),把資料以GB2312的編碼格式傳遞給apache,而apache伺服器不會改變從php傳來的資料,只是在應答 訊息頭部中把字元集設定成UTF-8: Content-type: text/html; charset=UTF-8. 也就是說你傳遞的是GB2312編碼的資料,而瀏覽器卻以UTF-8編碼來解釋應答訊息。

由 於UTF-8為3個位元組表示一個漢子,而普通的GB2312或BIG5是兩個。頁面輸出時,由於上述原因,出現半個漢字的情況,這時該半個漢字會和的 >結合成一個亂碼字,導致IE無法讀完的話,會發現實際上整個葉面全部已經輸出了。如果使用的是Mozilla、Mozilla Firefox、Sarafi的瀏覽器這不會造成這個問題,而是一堆亂碼。這是由於Firefox瀏覽器和IE解析網頁編碼的策略不同產生的。

OK,我們把test.php以UTF-8儲存,再用瀏覽器訪問時,就沒有問題了。可這樣做,會使得apache目錄下的所有web應用只能用同一種編碼。如何搞定?

解決辦法:

首先,可以使用AddDefaultCharset off來 關閉預設檔案編碼,這樣apache伺服器就不會在http應答訊息頭部設定charset,只是設定Content-type: text/html. 而瀏覽器就會依靠html檔案中設定的harset來決定編碼。其次,指令碼php.ini檔案中的default_charset = “UTF-8″作用同httpd.conf檔案,把該行注釋掉,使php自動識別檔案的編碼方式。

這樣不論你用什麼編碼方式,只要test.php中的
meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ 與你test.php檔案編碼方式相同,就不會產生亂碼問題。

使用者提交資料的編碼

瀏 覽器提交的字元編碼由用戶端的characher encoding決定。例如,當前瀏覽器的編碼是Gb2312,使用者提交資料後,無論apache設定的編碼方式是GB2312還是UTF-8,這時在服 務器端接收到的仍是以Gb2312編碼的資料。如果要在返回頁面上顯示使用者剛才提交的資料,而該頁面是用UTF-8編碼,或者要在資料庫中儲存的使用者提交 的資料,而資料庫是UTF-8編碼的,那就要做字元轉換了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.