Apache 中文亂碼解決方案

Apache 中文亂碼解決方案

服務器端:
======
修改httpd.conf (在Redhat中放置的位置爲/etc/httpd/conf/)
查找:
AddDefaultCharset ISO-8859-1
改爲:
#AddDefaultCharset ISO-8859-1
AddDefaultCharset off

這種方式關掉了服務器的默認語言的發送,這樣僅憑html文件頭中設置的語言來決定網頁語言。

不少文章都說經過修改成 AddDefaultCharset GB2312 把缺省語言改爲GB2312來解決中文亂碼,確實GB2312內碼的網頁能夠正常顯示了,但這並不是萬全之策。由於當你的網頁內碼不是GB2312,就算你在網頁用下面的meta指定了正確的語言,如ISO8859-1,也不會解碼爲ISO8859-1,由於Apache已經先你一步將GB2312指定爲網頁的語言了,以下圖:

而這個是加了 AddDefaultCharset off 後的:

修改後請從新啓動Apache,在Redhat中命令爲
/etc/init.d/httpd restart

當使用一些網頁腳本引擎,如PHP,還可能須要修改相應的配置文件。
以PHP爲例,須要修改php.ini (Red Hat中位置在/etc/)

找到:
default_charset = 「iso-8859-1″ 或者相似的,如 default_charset = 「gb2312″,將其註釋掉:
;default_charset=」iso-8859-1″

客戶端:
=====
在中文網頁請中依狀況在標籤中添加:
GB2312:
<META http-equiv=」Content-Type」 content=」text/html; charset=gb2312″ />
BIG5:
<META http-equiv=」Content-Type」 content=」text/html; charset=big5″ />
UTF-8: (注意是UTF-8,而不是UTF8,我已經上過當了)
<META http-equiv=」Content-Type」 content=」text/html; charset=utf-8″ />

若是仍是不正常,請清空瀏覽器的Cache試試。

另外附上goghs的」blog工具中中文的問題「一文的修正版,這篇文章很好的闡述了Charset和Encoding之間的關係。

    blog工具中中文的問題 [Blog] - goghs @ 23:26:56

    如今的blog工具徹底中文的並無,而通常程序的默認,都是使用iso8859-1字符集,或者說en語言編碼。字符集(Charset)和編碼(Encoding)是兩個不一樣的概念。

    若是你使用MT的默認安裝,或者使用B2的默認安裝,你會發現你所發佈的中文文章根本沒法正常顯示。(此處的MT的默認安裝,以使用MySQL爲基準,使用文件的我沒有測試,不便評述。)

    緣由很簡單,全部頁面的默認都是iso8859-1字符集,因此在數據插入數據庫的時候,都會被編碼(成爲html實體,如xxx;類型,xxxx此處都是數字)。

    處理的方式並不複雜,對MT而言,你須要將mt.cfg中的NoHTMLEntities以行前面的註釋符號去掉,變成
    NoHTMLEntities 1
    一次來禁止使用HTML::Entities進行實體編碼。
    而後修改CGI.pm中的一處,設置爲正確的gb2312字符集,我在前面的一篇文章中已經談到。

    而且須要修改全部的模板,將其中的charset從iso8859-1修改成gb2312。

    而對B2,B2config.php裏, 第91行有
    # IMPORTANT! set this to 0 if you are using Chinese, Japanese, Korean,
    #or other double-bytes languages
    $use_htmltrans = 0;

    把$use_htmltrans 設定成0就好了。

    編碼問題還牽涉到生成的RSS文件。做爲XML的一個詞聚集(此處翻譯成中文彷佛很讓人搞不清楚,也許直接用Vocabulary更好一點),RSS徹底須要遵循XML規範。
    全部的數據中,有5個字符必須進行特殊處理。它們是單引號(’), 雙引號(」), 小於號(< ),大於號(>),以及&,由於他們具備特殊的用處和意義。MT中Util模塊(Util.pm)中的encode_html函數負責處理,而在PHP中使用htmlspecialchars()函數作的就是一樣的工做(注意默認狀況下單引號是不被處理的,你須要使用ENT_QUOTES做爲第二個參數)。
    對RSS的生成,你只須要使用上述的方法進行處理,就是處理掉5各特殊字符,而千萬不要使用MT中的HTMLEntities和PHP中的 htmlentities()函數,由於這樣它會將非iso8859-1的字符所有轉換成實體,就是xxx;格式。對PHP,雖然4.1版本開始,雖然htmlspecialchars()函數能夠經過第三個參數傳遞一個charset來進行處理,可是以個人簡單測試,彷佛不行。
    另外須要對RSS指定一個正確的encoding, 就是將默認的
    <?xml version=」1.0″ encoding=」UTF-8″?>
    修改成
    <?xml version=」1.0″ encoding=」GB2312″?>
    (XML這裏確實比較糊塗,encoding使用charset)

    關於語言代碼和國際代碼,有不少複雜的標準,我也沒太搞清楚,這裏就不說了。總之記住對簡體中文,charset = gb2312 或者說更準確的應是 charset = GB2312, encoding = 「zh」。其餘的不知道也罷。

    在rss生成中,只要你在前面制定了正確的charset, 即便你沒有正確設置encoding,其源文件是徹底可讀的,只是若是你使用瀏覽器進行瀏覽時,它會以UTF-8編碼顯示,所以中文是亂碼,只有你正確制定了中文編碼後,才能夠正確顯示(你也能夠經過切換瀏覽器的編碼來看)。

    總之這是一個比較複雜的問題,個人能力有限,也只能解釋道這一步了。
    倉促中寫就,可能有不少錯誤,請你們指正。php

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~html

在配置文件中添加:數據庫

    IndexOptions Charset=GB2312瀏覽器

    這樣這樣就能解決Apache autoindex模塊中文亂碼問題了。服務器

相關文章
相關標籤/搜索