Web開發中如何解決中文亂碼問題

亂碼問題永遠是Web初學者的一個攔路虎,如果要避免亂碼問題。需要了解亂碼問題的成因。首先介紹幾種常見的編碼。

UTF-8(8-bit Unicode Transformation Format)

   UTF-8 是一種針對Unicode的可變長度字符編碼,也是一種前綴碼。它可以用來表示Unicode標準中的任何字符,且其編碼中的第一個字節仍與ASCII兼容,這使得原來處理ASCII字符的軟件無須或只須做少部份修改,即可繼續使用。因此,它逐漸成爲電子郵件、網頁及其他存儲或傳送文字的應用中,優先採用的編碼。

UTF-8使用一至四個字節爲每個字符編碼:

  1. 128個US-ASCII字符只需一個字節編碼(Unicode範圍由U+0000至U+007F)。

  2. 帶有附加符號的拉丁文、希臘文、西裏爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要二個字節編碼(Unicode範圍由U+0080至U+07FF)。

  3. 其他基本多文種平面(BMP)中的字符(這包含了大部分常用字)使用三個字節編碼。

  4. 其他極少使用的Unicode 輔助平面的字符使用四字節編碼。



gb2312

   gb2312是中華人民共和國國家標準簡體中文字符集,全稱《信息交換用漢字編碼字符集·基本集》,又稱GB0,由中國國家標準總局發佈,1981年5月1日實施。GB2312編碼通行於中國大陸;新加坡等地也採用此編碼。中國大陸幾乎所有的中文系統和國際化的軟件都支持GB 2312。

在使用GB2312的程序通常採用EUC儲存方法,以便兼容於ASCII瀏覽器編碼表上的“GB2312”,通常都是指“EUC-CN”表示法。

   每個漢字及符號以兩個字節來表示。第一個字節稱爲“高位字節”,第二個字節稱爲“低位字節”。

“高位字節”使用了0xA1-0xF7(把01-87區的區號加上0xA0),“低位字節”使用了0xA1-0xFE(把01-94加上0xA0)。 由於一級漢字從16區起始,漢字區的“高位字節”的範圍是0xB0-0xF7,“低位字節”的範圍是0xA1-0xFE,佔用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。

例如“啊”字在大多數程序中,會以兩個字節,0xB0(第一個字節)0xA1(第二個字節)儲存。(與區位碼對比:0xB0=0xA0+16,0xA1=0xA0+1)。



如果要避免Web頁面中的亂碼,最好統一字符串編碼:


1.建立數據庫的時候,選擇utf-8編碼

2.建立php文件的時候選擇utf-8編碼,

3.防止數據傳輸中亂碼 mysql_query('set names utf8');

4.在靜態頁面加上 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

5.在php文件中可以加上header(“Content-Type: text/html; charset=utf-8");


以下是常見情況下的亂碼成因及解決方法:


1、數據庫採用UTF8 編碼,而頁面申明編碼是GB2312 ,這是最常見的產生亂碼的原因。這時候在PHP腳本里面直接SELECT數據出來的就是亂碼,需要在查詢前先使用: mysql_query("SET NAMES GBK"); 來設定MYSQL連接編碼,保證頁面申明編碼與這裏設定的連接編碼一致(GBK是GB2312的擴展 )。如果頁面是UTF-8 編碼的話,可以用: mysql_query("SET NAMES UTF8"); 注意是UTF8而不是一般用的UTF-8。假如頁面申明的編碼與數據庫內部編碼一致可以不設定連接編碼。


2、頁面申明編碼與文件本身編碼不一致,這種情況很少發生,因爲如果編碼不一致美工做頁面時候在瀏覽器看到的就是亂碼了。更多時候是發佈以後修改一些小BUG,以錯誤編碼打開頁面然後保存導致的。或者是用某些FTP軟件直接在線修改文件,比如CuteFTP,由於軟件編碼配置錯誤而導致轉換錯了編碼。


3、ajax與後臺交互的時候可能會產生中文亂碼,這是你js交互的後臺腳本輸出時,由於ajax在接收responseText或responseXML的值時是按照UTF-8的編碼格式進行解碼的,所以如果服務器端傳遞的數據不是UTF-8格式,在接收responseText或responseXML的值時,就可能產生亂碼,解決的辦法是保證從服務器端傳遞的數據採用UTF-8的編碼格式。

例如:

response.setContentType("text/html;charset=utf-8");(JSP)

header(“Content-Type: text/html; charset=utf-8");(PHP)


4. 下載文件時,中文文件名在IE或者火狐中亂碼的問題。這個是由於瀏覽器對下載的文件名進行url解碼的原因。PHP可以採用urlencode($filename);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章