Apache環境下頁面亂碼的幾種可能總結

採用典型的LAMP架構開發的時候,環境中多處涉及到編碼的指定,有一個地方忽略,都有可能形成頁面漢字亂碼的產生,本文將總結這些亂碼產生的可能的緣由,方便咱們排查。html

一、頁面中的問題。瀏覽器

每一個網頁文件都有其編碼,同時網頁文件的源碼中,也有一個位置會告訴瀏覽器,這個頁面應該用什麼樣的編碼去解釋。服務器

<meta http-equiv=」Content-Type」 content=」text/html; charset=UTF-8」 />架構

這裏指定的編碼應該和頁面自己的編碼一致,不然就會產生亂碼。ui

還有一個須要注意的問題:當在ie瀏覽器下面瀏覽網頁面的時候使用 utf-8 編碼,<title>標籤被放在<meta>標籤前面。當title爲中文的時(好比Blog名爲中文或者文章標題爲中文),在 IE下會出現顯示空白頁的問題。而使用gbk或者gb2312等編碼就不會有什麼問題了。編碼

這個問題是因爲 utf-8 使用3個字節表示一個漢字,而GB2312或BIG5使用兩個字節。頁面輸出時,因爲上述緣由,使瀏覽器解析、輸出<title> </title>的內容時,若是在</title>前有奇數個全角字符時,IE把 UTF-8 看成兩個字節解析時出現半個漢字的狀況,這時該半個漢字會和</title>的<結合成一個亂碼字,致使IE沒法讀完< title>部分,導致整個頁面爲空百輸出。此時查看源文件,會發現實際上整個頁面所有已經下載了。spa

瀏覽器得到編碼的方式code

HTTP Header中的"Content-Type」項; 
返回的html代碼開頭是否有BOM(Byte of Marker); 
html代碼中的 meta 標籤;orm

瀏覽器解碼解析網頁的過程server

瀏覽器(不管是IE仍是Firefox)在解析頁面時,首先取HTTP Header中的Content-Type項,若是有寫明charset的話就認定頁面的編碼方式爲charset指定的值。若是沒有指明,則認定爲默認值。根據上表,IE中文版的默認值是GB2312,Firefox中文版的默認值是GBK,不過IE的GB2312好像和GBK沒啥區別。而後,瀏覽器會看一下有沒有BOM。一旦發現有UTF-8的3字節BOM,則從新認定頁面的編碼方式爲UTF-8。

解碼階段,解碼完成後是解析html的階段。解析html的過程當中,當解析到head部分的meta標籤時,瀏覽器會根據<meta http-equiv=」Content-Type」 content=」text/html; charset=UTF-8″ />這個語句中的說明,從新認定編碼方式爲charset後面的方式,中斷html解析過程,返回到解碼步驟從新解碼。

meta標籤的做用

「meta是用來在HTML文檔中模擬HTTP協議的響應頭報文。」在meta標籤中寫和在HTTP頭裏寫是同樣的,這也是爲了解決用普通 HTML寫網頁的人沒法自行定義HTTP頭的問題。可是,meta是一個html標籤,因此必須進入到html解析的步驟才能生效,而生效後,瀏覽器會退回幾步,從新設置好HTTP頭從頭再開始解碼、解析html。因此meta中寫的內容會覆蓋HTTP頭裏的內容,不管哪一個瀏覽器都是這樣的。

二、Apache的DefaultCharset配置。

Apache2的配置中有這麼一項 AddDefaultCharset ,默認這項設置在配置文件中並無指定的。

AddDefaultCharset 指令 
說明     當應答內容是text/plain或text/html時,在HTTP應答頭中加入的默認字符集 
語法     AddDefaultCharset On|Off|charset 
默認值     AddDefaultCharset Off 
做用域     server config, virtual host, directory, .htaccess 
覆蓋項     FileInfo 
狀態     核心(C) 
模塊     core

當且僅當應答內容是text/plain或text/html時,此指令將會在HTTP應答頭中加入的默認字符集。理論上這將覆蓋在文檔體中經過<meta>標 籤指定的字符集,可是實際的行爲一般取決於用戶瀏覽器的設置。AddDefaultCharset Off 將會禁用此功能。 AddDefaultCharset On 將啓用Apache內部的默認字符集iso-8859-1 。您也能夠指定使用在IANA註冊過的字符集名字 中的另一個charset 。好比說: AddDefaultCharset utf-8

也就是說,當Apache不指定defaultcharset的時候,頁面編碼由頁面本身的meta標籤指定。 當Apache指定的時候,將忽略頁面中的meta標籤指定的編碼. 可是允許腳本直接header編碼方式給客戶端。

這樣,咱們就清楚了,服務器配置通常不選擇這一項,就給咱們頁面編寫帶來了不少靈活性。同一個服務器中,能夠存在不一樣編碼的網頁。固然,這並非一個很好的習慣。

相關文章
相關標籤/搜索