天天看點

字元編碼和中文亂碼

記得剛使用ubuntu的時候,處理各種亂碼神馬的都是很麻煩的事情,後來開始寫一些web程式的時候,中文編碼的問題還是會不斷的出現,于是對于web程式員來說,字元集編碼已經是十分常見的問題了,但是如果不去系統的了解下,處理問題時還是會有些棘手的,這篇文章我就打算簡單的介紹下這些問題。

最初學習計算機的話,首先接觸的便是ASCII編碼了,0是48,a是97啥的估計大家都記得很清楚吧,計算機中以8bit為一個byte,于是一個byte能表示256個數,ascii是用一個位元組,并且第一位是0,也就是說隻用了7個bit,于是ASCII隻有128種表示,這對于英文系統是最夠的了。但是歐洲很多字母和英文字母很不相同,于是為了擴充,第一位也納入使用,這樣就是ISO8859-1編碼,又叫做latin-1,很多時候你不指定編碼的時候,預設編碼就是ISO8859-1,這是一個要注意的地方。

由于亞洲地區的文字不像歐洲那樣用幾個字母就可以了,于是亞洲各地區便有了自己的一些編碼格式。對于中文編碼而言,大家比較熟悉的就是GB2312編碼,這是大陸地區推行的簡體字的編碼标準,而相應的台灣的繁體字用的是BIG5的繁體字編碼,由于GB2312隻有簡體字,後來又進行了擴充,便有了GBK,他是GB2312的超集,就是說GB2312編碼的字元,都可以用GBK的方式解讀。後來又加入了少數民族的字型有了GB18030,不過這個貌似不如GBK應用廣泛。

由于混亂的編碼格式,造成了國際化的困難,于是便有了大有一統天下之勢的unicode編碼,對于各國文字元号等都會在unicode有一個統一的編碼,但是unicode隻是一種表示方式,但是卻沒有規定表示符号的這個數字應該如何在計算機上存儲。而現在比較通行的存儲方式是utf-8,utf-8是一種變長的編碼方式。

是以對于中文字元而言,我們最常見的就是GBK和utf-8兩種編碼格式。對于windows而言用一種叫ANSI的編碼格式,他是英文用ASCII編碼,簡體中文用GB2312編碼,而linux等系統一般都會采用utf-8的編碼方式,是以當你在linux下打開windows下的一些中文文本檔案時會出現亂碼的情況,就是因為本來應該是GB2312的編碼方式,卻用utf-8的格式來解讀必然就會出現錯誤。

當寫web程式時也要時刻注意編碼的統一,也就是資料庫裡資料的編碼,程式檔案的編碼,以及網頁顯示的編碼(就是charset字段),以及他們之間的通信的編碼方式。比如你是在windows寫程式的話,預設的程式編碼就是GBK,為了統一,你需要資料庫也要改為GBK編碼,網頁上也要加上這樣一句。

1.  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />      

還有個需要注意的地方,就是當你使用的資料庫是mysql時,預設的字元通信方式是ISO8859-1,你需要加上這樣一句,來讓通信字元也變為GBK,這樣就能在網頁上正常顯示出漢字了。

1. mysql_query
    (
    'set names gbk'
    )
    ;