編碼格式 & 字符集 & 中文亂碼問題

一、編碼格式和字符集

編碼,意思是指將數據通過一定方式表達或儲存,這個方式就叫編碼。在計算機中,使用相應的標準存儲自然語言的方式就叫做編碼格式。

字符集,在計算機內部,規定一組字符的集合對應自然語言,這個統一的標準叫編碼,而與自然語言對應的這組字符的集合就叫做字符集。計算機發展史中已經存在很多的字符集,如GB2312字符集,GBK字符集等等。

二、編碼格式發展史

在計算機設計之初,人們使用8個開閉式晶體管可以組成一組狀態,其中,0開始的32種爲控制碼,後面加上字母,數字等共128個存儲信息,他們把這套方案叫做 ANSI 的“ascii”編碼

後來,計算機發展,後面的128個空位被其他國家陸續佔用,而128到255這一頁的字符集合就被成爲“擴展字符集”。

等到了中國人得到計算機時,已經沒有可以利用的字節狀態來表示漢字了,於是國人自主研發,把127號之後的奇異符號直接取消掉。規定:一個小於127的字符意義與原來相同,但是兩個大於127的字符連在一起時,就表示一個漢字,前面的一個字節(他稱爲高字節)從0xA1到0xF7,後面一個字節(低字節)從0xA1到0xFE,這樣大約組合出7000多個簡體漢字。然後加了一些其他字符,就統統重新編了兩個字節長的編碼,這就是常說的“全角”字符,而原來的127號以下的那些就叫“半角字符”。國民看到這樣很不錯,於是就把這套方案叫做“GB2312”。GB2312 是對 ASCII 的中文擴展。

後來,僅使用GB2312字符集很多中文字符在電腦中無法打出來,於是乾脆不再要求低字節一定是127號之後的內碼,只要第一個字節是大於127就固定表示這是一個漢字的開始,不管後面跟的是不是擴展字符集裏的內容。擴展之後的編碼方案被稱爲 GBK 標準,GBK包括了GB2312 的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。總之 GBK 是對 GB2312 的擴展。

後來少數民族也要用電腦了,於是我們再擴展,又加了幾千個新的少數民族的字,GBK擴成了GB18030。從此之後,中華民族的文化就可以在計算機時代中傳承了。 中國的程序員們看到這一系列漢字編碼的標準是好的,於是通稱他們叫做 “DBCS”(DoubleByte Charecter Set, 雙字節字符集)。

在中國開始建造自己的字符集時,各個國家也都有了自己的編碼,這樣互相交流起來就不方便了,有個叫做ISO的組織想了一個辦法來解決這個問題。他們規定,廢除地方性的編碼方式,改用全球統一的編碼,他們還爲此編碼格式取了個名字,叫“Universal Multiple-Octet Coded Character Set”,即通用多八位編碼字符集,也就是我們常說的“Unicode”字符集。

ISO規定所有的字符(注意,這裏的字符指的是廣義上的字符,也就是符號)必須用兩個字節來表示,對於ASCII裏的那些“半角”字符,unicode包持其原編碼不變,只是將其長度由原來的8位擴展爲16位,而其他文化和語言的字符則全部重新統一編碼。由於”半角”英文符號只需要用到低8位,所以其高8位永遠是0,因此這種大氣的方案在保存英文文本時會多浪費一倍的空間。同時,Unicode 編碼無法區分ASCII 字符。

而在UNICODE到來的時候,還有計算機網絡的興起,字節在網絡上怎麼傳輸,這時候就有了UTF(UCS transform format)標準,其中UTF-8就是每次8個位傳輸數據。 而UTF-16就是每次16個位。UTF-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度,當字符在ASCII碼的範圍時,就用一個字節表示,保留了ASCII字符一個字節的編碼做爲它的一部分,注意的是unicode一箇中文字符佔2個字節,而UTF-8一箇中文字符佔3個字節)。從Unicode到UTF-8並不是直接的對應,而是要過一些算法和規則來轉換。

三、中文編碼總結

中文字符常見的編碼方式有:GBK,GB2312 和 UtF-8。這些都是內碼,即中文字符存儲在計算機中的二進制字符編碼方式。他們的存儲方式對比:

  編碼方式 中文字符佔內存 英文字符佔內存
GB2312 定長編碼 2個字節 一個字節
GBK 定長編碼 2個字節 一個字節
UTF-8 變長編碼 3個字節 一個字節

由於同一個字符使用不同的編碼方式在計算機內部使用的內碼可能不同,所以,若計算機終端(控制檯)的編碼方式跟文本保存的編碼方式不同,其輸出的文字就是亂碼了。

 

 

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