1. 程式人生 > >關於Unicode編碼和UTF-8編碼

關於Unicode編碼和UTF-8編碼

        說到編碼,得先從ASCII編碼講起。ASCII編碼是由美國人發明,美國的字元不超過255個,所以ASCII編碼使用了8bit 即一個位元組來儲存字元。由於漢字的數量遠超255個,所以中國自己發明了一個GB2312編碼來表示漢字,一般的漢字使用2個位元組,對於一些生僻的漢字則使用更多的位元組來表示,當然,GB2313編碼是可以相容ASCII碼的。

        然後,日本,韓國等等國家也自己發明了一套編碼方法,這時候又出現了一個新的問題。如果一篇文章裡面,即有中文,又有日文的話,無論使用中文的編碼方法還是使用日文的編碼方法都會出現亂碼。隨後,unicode編碼便應運而生。unicode編碼對文字的編碼進行了統一,當然,unicode只是一種編碼規範,它有多個版本,常用的unicode編碼使用了16位來儲存字元,16位的儲存空間足以容納世界上所有書面字元(對於漢字來說,一共有6萬多個,只能包含其中的一些常用漢字,所以unicode編碼對於漢字的相容性並不是特別好)。unicode編碼相容了ASCII碼,ASCII碼轉unicode編碼時,保持後8位不變,前8位只需要用0去補全即可。

        使用了unicode編碼後,又有新的問題出現。因為unicode編碼是用兩個位元組來儲存字元,如果一篇文章中,大部分都是英文,使用unicode編碼就會造成空間的浪費,對英文部分使用ASCII碼只需要一個位元組就可以了。這時候,utf-8解決了這個問題。utf-8是一種可變長的字元編碼,當儲存英文時只使用一個位元組,節省了一半的空間,而儲存中文字元時,長度還是不變。utf-8雖然壓縮了儲存空間,但是如果在記憶體中儲存,使用utf-8卻由於它的長度不固定,帶來了很大的不便,使得在記憶體處理字元變得複雜。應對這個問題的解決策略是:在記憶體中儲存字元時還是使用unicode編碼,因為unicode編碼的長度固定,處理起來很方便。而在檔案的儲存中,則使用utf-8編碼,可以壓縮記憶體,節省空間。這裡一般有個自動轉換的機制,即從檔案中讀取utf-8編碼到記憶體時,會自動轉換為unicode編碼,而從記憶體中將字元儲存到檔案時,則自動轉換為utf-8編碼。