欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于Apache默認(rèn)編碼錯(cuò)誤 導(dǎo)致網(wǎng)站亂碼的解決方案

 更新時(shí)間:2011年12月07日 16:20:40   作者:  
Apache默認(rèn)編碼UTF-8在解析A網(wǎng)站的時(shí)候沒(méi)有任何問(wèn)題,當(dāng)運(yùn)行B網(wǎng)站時(shí)出現(xiàn)的"蝌蚪文"亂碼問(wèn)題
最近經(jīng)常有同學(xué)在使用LAMP/WAMP時(shí),遇到這樣的編碼錯(cuò)誤問(wèn)題:

A網(wǎng)站程序編碼UTF-8編碼安裝成功,運(yùn)行成功。

B網(wǎng)站程序編gb2312也要安裝在同一服務(wù)器上。

這樣就出現(xiàn)問(wèn)題了,Apache默認(rèn)編碼UTF-8在解析A網(wǎng)站的時(shí)候沒(méi)有任何問(wèn)題,當(dāng)運(yùn)行B網(wǎng)站時(shí)出現(xiàn)的"蝌蚪文"亂碼問(wèn)題。

單純的修改Apache默認(rèn)編碼為gb2312這樣就導(dǎo)致A網(wǎng)站出現(xiàn)"蝌蚪文"。

問(wèn)題分析:

如果你在網(wǎng)上搜索 “apache配置”,搜到的頁(yè)面大多都會(huì)建議你在httpd.conf中加上這么一句:AddDefaultCharset GB2312。

對(duì)于新手而且是只用GB2312編碼的開(kāi)發(fā)人來(lái)說(shuō),這么做是ok的。但是如果要想使用UTF-8字符集的話,比如 在test.php文件中需要有 meta http-equiv="Content-Type" content="text/html; charset=UTF-8" 這段代碼。

這時(shí)你再打開(kāi)瀏覽器訪問(wèn)test.php頁(yè)面的話,你看到的是正確的頁(yè)面。但是如果實(shí)際上瀏覽器還是以GB2312編碼解釋從服務(wù)器返回的response,為什么呢?原因是瀏覽器是根據(jù)http應(yīng)答消息頭部中的 Content-type: text/html; charset=GB2312 來(lái)決定使用何種編碼解釋?xiě)?yīng)答,也就是說(shuō)apache服務(wù)器仍然用GB2312編碼傳遞數(shù)據(jù)。

所以說(shuō)如果apache的默認(rèn)字符集被設(shè)置成了GB2312,即使在頁(yè)面中聲明使用UTF-8編碼,apache服務(wù)器還是會(huì)按照GB2312編碼來(lái)傳送http response。沒(méi)關(guān)系,我們把AddDefaultCharset GB2312 改成 AddDefaultCharset UTF-8,看看什么結(jié)果?

如果你看到亂碼恭喜你,你還知道是亂碼問(wèn)題;如果你看到是空白頁(yè)面,那么你就慘了,你可能會(huì)以為這是其他什么原因造成的,而不會(huì)從編碼的角度去考慮怎么解決問(wèn)題。這是為什么?原因在于php文件本身是用系統(tǒng)字符集來(lái)編碼的,中文的windows XP都是用GB2312,每一個(gè)文件頭部都有字段指示該文件是用何種方式編碼的。當(dāng)apache接到瀏覽器的請(qǐng)求后,會(huì)讓php去解釋所請(qǐng)求的頁(yè)面,比如 test.php。php會(huì)識(shí)別出test.php的編碼方式是GB2312后(就像我們用javac編譯java源文件時(shí),編譯器默認(rèn)用系統(tǒng)編碼讀源文件里的內(nèi)容。

如果源文件不是用系統(tǒng)編碼來(lái)保存的,可以用命令javac -encoding指定具體的編碼),把數(shù)據(jù)以GB2312的編碼格式傳遞給apache,而apache服務(wù)器不會(huì)改變從php傳來(lái)的數(shù)據(jù),只是在應(yīng)答消息頭部中把字符集設(shè)置成UTF-8: Content-type: text/html; charset=UTF-8. 也就是說(shuō)你傳遞的是GB2312編碼的數(shù)據(jù),而瀏覽器卻以UTF-8編碼來(lái)解釋?xiě)?yīng)答消息。

由于UTF-8為3個(gè)字節(jié)表示一個(gè)漢子,而普通的GB2312或BIG5是兩個(gè)。頁(yè)面輸出時(shí),由于上述原因,出現(xiàn)半個(gè)漢字的情況,這時(shí)該半個(gè)漢字會(huì)和的>結(jié)合成一個(gè)亂碼字,導(dǎo)致IE無(wú)法讀完的話,會(huì)發(fā)現(xiàn)實(shí)際上整個(gè)葉面全部已經(jīng)輸出了。如果使用的是Mozilla、Mozilla Firefox、Sarafi的瀏覽器這不會(huì)造成這個(gè)問(wèn)題,而是一堆亂碼。這是由于Firefox瀏覽器和IE解析網(wǎng)頁(yè)編碼的策略不同產(chǎn)生的。OK,我們把test.php以UTF-8保存,再用瀏覽器訪問(wèn)時(shí),就沒(méi)有問(wèn)題了。

可這樣做,會(huì)使得apache目錄下的所有web應(yīng)用只能用同一種編碼。如何搞定?

解決辦法:

首先,可以使用AddDefaultCharset off來(lái)關(guān)閉默認(rèn)文件編碼,這樣apache服務(wù)器就不會(huì)在http應(yīng)答消息頭部設(shè)置charset,只是設(shè)置Content-type: text/html. 而瀏覽器就會(huì)依靠html文件中設(shè)置的harset來(lái)決定編碼。

其次,腳本php.ini文件中的default_charset = “UTF-8″作用同httpd.conf文件,把該行注釋掉,使php自動(dòng)識(shí)別文件的編碼方式。

這樣不論你用什么編碼方式,只要test.php中的meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ 與你test.php文件編碼方式相同,就不會(huì)產(chǎn)生亂碼問(wèn)題。用戶提交數(shù)據(jù)的編碼瀏覽器提交的字符編碼由客戶端的characher encoding決定。

例如,當(dāng)前瀏覽器的編碼是Gb2312,用戶提交數(shù)據(jù)后,無(wú)論apache設(shè)置的編碼方式是GB2312還是UTF-8,這時(shí)在服務(wù)器端接收到的仍是以Gb2312編碼的數(shù)據(jù)。

如果要在返回頁(yè)面上顯示用戶剛才提交的數(shù)據(jù),而該頁(yè)面是用UTF-8編碼的或者要在數(shù)據(jù)庫(kù)中存儲(chǔ)的用戶提交的數(shù)據(jù),而數(shù)據(jù)庫(kù)是UTF-8編碼的,那就要做字符轉(zhuǎn)換了。

相關(guān)文章

  • .htaccess 頂級(jí)域名重定向綁定空間目錄

    .htaccess 頂級(jí)域名重定向綁定空間目錄

    .htaccess可以簡(jiǎn)單的實(shí)現(xiàn)二級(jí)域名重定向本站提到過(guò),其實(shí)簡(jiǎn)單的修改一下就可以實(shí)現(xiàn)頂級(jí)域名重定向到空間目錄
    2012-05-05
  • apache的AllowOverride以及Options使用詳解

    apache的AllowOverride以及Options使用詳解

    通常利用Apache的rewrite模塊對(duì) URL 進(jìn)行重寫(xiě)的時(shí)候, rewrite規(guī)則會(huì)寫(xiě)在 .htaccess 文件里。但要使 apache 能夠正常的讀取.htaccess 文件的內(nèi)容,就必須對(duì).htaccess 所在目錄進(jìn)行配置
    2012-11-11
  • Linux使用stty顯示修改終端行設(shè)置

    Linux使用stty顯示修改終端行設(shè)置

    這篇文章主要介紹了Linux使用stty顯示修改終端行設(shè)置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 詳解Linux LVM邏輯卷配置過(guò)程(創(chuàng)建,增加,減少,刪除,卸載)

    詳解Linux LVM邏輯卷配置過(guò)程(創(chuàng)建,增加,減少,刪除,卸載)

    這篇文章主要介紹了詳解Linux LVM邏輯卷配置過(guò)程(創(chuàng)建,增加,減少,刪除,卸載),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 在ubuntu下查看顯卡驅(qū)動(dòng)是否已經(jīng)成功安裝的方法

    在ubuntu下查看顯卡驅(qū)動(dòng)是否已經(jīng)成功安裝的方法

    今天小編就為大家分享一篇在ubuntu下查看顯卡驅(qū)動(dòng)是否已經(jīng)成功安裝的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • 使用ssh-keygen,實(shí)現(xiàn)免密碼登陸linux的方法

    使用ssh-keygen,實(shí)現(xiàn)免密碼登陸linux的方法

    下面小編就為大家?guī)?lái)一篇使用ssh-keygen,實(shí)現(xiàn)免密碼登陸linux的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • Linux下9種優(yōu)秀的代碼比對(duì)工具推薦小結(jié)

    Linux下9種優(yōu)秀的代碼比對(duì)工具推薦小結(jié)

    這篇文章主要介紹了Linux下9種優(yōu)秀的代碼比對(duì)工具推薦小結(jié),不僅有命令行工具,還有 GUI 界面工具,讓你輕松進(jìn)行代碼比對(duì),感興趣的可以一起來(lái)了解一下
    2020-06-06
  • Linux服務(wù)器配置多個(gè)svn倉(cāng)庫(kù)流程詳解

    Linux服務(wù)器配置多個(gè)svn倉(cāng)庫(kù)流程詳解

    這篇文章主要介紹了linux服務(wù)器配置多個(gè)svn倉(cāng)庫(kù)流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • CentOS7.5從零安裝Python3.6.6的教程詳解

    CentOS7.5從零安裝Python3.6.6的教程詳解

    這篇文章主要介紹了CentOS7.5從零安裝Python3.6.6的教程,本文通過(guò)實(shí)例圖文相結(jié)合的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-10-10
  • Linux如何定時(shí)清空日志內(nèi)容和刪除日志文件

    Linux如何定時(shí)清空日志內(nèi)容和刪除日志文件

    這篇文章主要介紹了Linux如何定時(shí)清空日志內(nèi)容和刪除日志文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論