我們在寫程序的時候經常遇到轉碼的問題,或者亂碼的問題。這本文章就把經常遇到的ASCII,Unicode 和 UTF-8給大家梳理一下。
一、ASCII 碼
ASCII(美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統,對英語字符與二進位位之間的關係,它是現今最通用的單字節編碼系統。
ASCII 碼使用指定的7 位或8 位二進位數組合來表示128 或256 種可能的字符。標準ASCII 碼也叫基礎ASCII碼,使用7 位二進位數(剩下的1位二進位為0)來表示所有的大寫和小寫字母,數字0 到9、標點符號, 以及在美式英語中使用的特殊控制字符。
非 ASCII 編碼
英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的。比如,在法語中,字母上方有注音符號,它就無法用 ASCII 碼表示。於是,一些歐洲國家就決定,利用字節中閒置的最高位編入新的符號。
二. Unicode
Unicode(統一碼、萬國碼、單一碼)是計算機科學領域裡的一項業界標準,包括字符集、編碼方案等。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一併且唯一的二進位編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。1990年開始研發,1994年正式公布。
Unicode 當然是一個很大的集合,現在的規模可以容納100多萬個符號。每個符號的編碼都不一樣,比如,U+0639表示阿拉伯字母Ain,U+0041表示英語的大寫字母A,U+4E25表示漢字嚴。具體的符號對應表,可以查詢unicode.org,或者專門的漢字對應表。
Unicode的問題:
Unicode只是一個符號集,它只規定了符號的二進位代碼,卻沒有規定這個二進位代碼應該如何存儲。
1)出現了Unicode的多種存儲方式,也就是說有許多種不同的二進位格式,可以用來表示Unicode。
2)Unicode在很長一段時間內無法推廣,直到網際網路的出現。
三、UTF-8
UNICODE比ASCII佔用大一倍的空間,而對ASCII來說高字節的0對他毫無用處。為了解決這個問題,就出現了一些中間格式的字符集,他們被稱為通用轉換格式,即UTF
UTF-8就是在網際網路上使用最廣的一種Unicode的實現方式。其他實現方式還包括UTF-16(字符用兩個字節或四個字節表示)和UTF-32(字符用四個字節表示),不過在網際網路上基本不用。重複一遍,這裡的關係是,UTF-8是Unicode的實現方式之一。
六、decode和encode的區別
字符串在Python內部的表示是unicode編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字符串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
decode的作用是將其他編碼的字符串轉換成unicode編碼,如str1.decode('gb2312'),表示將gb2312編碼的字符串str1轉換成unicode編碼。
encode的作用是將unicode編碼轉換成其他編碼的字符串,如str2.encode('gb2312'),表示將unicode編碼的字符串str2轉換成gb2312編碼。