首先說一下背景:由于計算機是美國人發明的,因此最早只有127個字母被編碼到計算機中,也就是大小寫英文字母、數字和一些符號,這個編碼表稱為ASCII編碼。
例如:大寫字母A的編碼是65,小寫字母z的編碼時122。
要處理中文,顯然一個字節是不夠的,至少需要兩個字節,且不能和ASCII編碼沖突,所以我國制定了GB2312編碼,用于把中文編進去。
可以想象,全世界上有上百種語言,日本把日文編寫到Shift_JIS里,韓國把韓文編寫到Euc-kr里,各國有各國的標準,就不可避免出現沖突,結果就是,在多語言混合的文本中就會顯示亂碼。
在此背景下,Unicode應運而生,Unicode把所有語言都統一到一套編碼里,這樣就不會有亂碼問題了。
Unicode標準在不斷發展,最常用的是用兩個字節表示一個字符(如果要用到非常生僻的字符,就需要4個字節)。現代操作系統和大多數編程語言都直接支持Unicode。
下面看看ASCII編碼和Unicode編碼的區別:ASCII編碼時1個字節,二Unicode編碼通常是兩個字節。
字母A用ASCII編碼是十進制的65,二進制的01000001。
字符0用ASCII編碼是十進制的48,二進制的00110000。
注意字符0和整數0是不同的。
漢字“中”已經超出了ASCII編碼的范圍,用Unicode編碼是十進制的20013,二進制的01001110 00101101。
如果把ASCII編碼的A用Unicode編碼,只需要在前面補0就可,因此A的Unicode編碼是00000000 01000001。
那么新的問題就出現了:如果統一成Unicode編碼,亂碼問題從此消失了,但是寫的文本基本上全部是英文時,用Unicode編碼比ASCII編碼多一倍存儲空間,在存儲和傳輸上十分不劃算。
本著節約的精神,又出現了把Unicode編碼轉化成為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1~6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4~6個字節。如果你要傳輸的文本包含大量英文字母,用UTF-8編碼就會節省空間。
各編碼方式的比較
由上表可知,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可看成是UTF-8編碼的一部分,所以只支持ASCII編碼的大量歷史遺留軟件可在UTF-8編碼下繼續使用。
搞清楚ASCII、Unicode和UTF-8的關系后,可總結一下現在計算機系統通用的字符編碼工作方式:在計算機內存中,統一使用Unicode編碼,當需要保持到硬盤或需要傳輸時,可轉換為UTF-8編碼。
例如,用記事本編輯時,從文件讀取的UTF-8字符轉換為Unicode字符到內存;編輯完成后,保持時再把Unicode轉換為UTF-8保持到文件。
瀏覽網頁時,服務器會把動態生成的Unicode內容轉換為UTF-8再傳輸到瀏覽器,如下圖所示:
我們經常看到很多網頁的源碼上有類似<meta charset=’UTF-8’/>的信息,表示該網頁用的是UTF-8編碼。






