本文總結自:https://blog.csdn.net/zmx729618/article/details/51821024
?
1. ISO 8859-1
字節數:1
范圍:0-255(編碼范圍是0x00-0xFF),其中0x00-0x7F之間完全和ASCII一致(ASCII是7位編碼,能個表示128個字符),因此向下兼容ASCII
表達范圍:多用于英文系列,還包括西歐語言、希臘語、泰語、阿拉伯語、希伯來語對應的文字符號。。。無法表示中文字符。
備注:由于ISO-8859-1編碼范圍使用了單字節內的所有空間,在支持ISO 8859-1的系統中,傳輸和存儲其他任何編碼的字節流都不會被拋棄。換言之,把其他任何編碼的字節流當作ISO-8859-1編碼看待都沒有問題(可以用它表示其他編碼)。
這是個很重要的特性,所以很多情況下(如很多協議傳輸數據時)都使用ISO 8859-1編碼。
?
?
2. GB2312/BIG5/GBK?
GB2312
范圍:ISO 8859-1的范圍+簡體中文
字節數:表達漢字時2個字節,表達英文1個字節,與ISO 8859-1一致,屬于變長編碼系統
BIG5
表達繁體漢字,多與GB2312結合使用
GBK
為解決GB2312與BIG5不兼容問題而誕生
范圍:ISO 8859-1的范圍+?所有亞洲文字的雙字節字符,包括簡體中文,繁體中文,日語,韓語等
字節數:類似于GB2312,屬于變長編碼系統
?
3. Unicode
范圍:所有語言
字節數:2個字節,包括英文字母在內,都以雙字節表示,所以它是不兼容ISO 8859-1編碼的。對于ISO 8859-1中所編碼的字符,Unicode編碼只是在前面增加了一個全為0字節
?
4. UTF/UTF-8/UTF-16/UTF-32
UTF
Unicode編碼不兼容ISO 8859-1編碼,而且容易占用更多的空間:因為對于英文字母,Unicode也需要兩個字節來表示,所以Unicode不便于傳輸和存儲。因此而產生了UTF編碼。
UTF是(Unicode Translation Format),即Unicode用于傳輸的格式。
?
UTF-32
字節數:4
Linux操作系統上所使用的Unicode方案,也是一種定長編碼。其缺點很顯然是造成了空間的巨大浪費,從而非常沒有效率,因此沒有UTF-8和UTF-16使用的頻繁,不做贅述。
?
UTF-16
字節數:2
但是,上文已經提到,Unicode基本多語言平面的字符只使用2個字節就可以表示了,真正需要擴展到4個字節來表示的字符少之又少。所以使用2個字節來表示Unicode代碼是一種很自然的選擇,例如英文的Unicode范圍是0x0000-0x007F,中文的Unicode范圍是0x4E00-0x9F**。對于那些擴展平面中需要4個字節才能表示的字符,UTF-16使用一種代理的手法來擴展(使用了基本多語言平面保留的0xD800-0xDFFF區段,表示這是一個代理,從而用2個16位碼元組成一個字符)。這樣的好處是大量的節約了存取空間,也提高了處理的速度。這種Unicode表示方法就是UTF-16,顯然,UTF-16需要1個或者2個16位長的碼元來表示,因此這是一個變長表示。一般在Windows平臺上,提到Unicode,那就是指UTF-16了。
UTF-16有一個著名的Endian的問題,即UTF16-LE和UTF16-BE,LE指Little Endian,而BE指Big Endian。關于這方面的信息,網上有很多相關的帖子。這與計算機的CPU架構有一定關系,我們一般的X86系統都是Little Endian的,可以認為UTF16就是UTF16-LE。
另外,UTF有一個BOM(Byte Order Mark)的問題。在Unicode編碼中有一個叫做"zero-width no-break space (ZWNBSP)"的字符,它的編碼是0xFEFF。而0xFEFF在是一個實際中不存在的字符,所以不應該出現在實際傳輸中。UCSUCS (Unicode?Character Set) 規范建議我們在傳輸字節流前,先傳輸字符"ZWNBSP"。這樣如果接收者收到FEFF,就表明這個字節流是Big-Endian的;如果收到FFFE,就表明這個字節流是Little- Endian的。因此字符"ZWNBSP"又被稱作BOM。
?
UTF-8
字節數:1-6個不等,例如中文,3個字節,英文,1個字節,兼容ISO 8859-1
UTF16的最大好處在于大部分字符都以固定長度的字節(2字節)儲存,但UTF-16卻無法兼容于ASCII編碼。由于對于歐洲和北美,實際上使用的編碼范圍在0x0000-0x00FF之間,只需要一個字符就可以表示所有的字符。即使是使用UTF16來作為內存的存取方式,還是會帶來巨大的空間浪費,因此就有了UTF8的編碼方式。
UTF-8編碼是最靈活的UTF編碼形式,即兼容ISO 8859-1的編碼,同時也可以用來表示所有語言的字符。顯然,UTF-8編碼是不定長編碼,每一個字符的長度從1-6個字節不等。另外,UTF編碼自帶簡單的校驗功能。
備注:
理論上將,UTF-8 格式使用1-6字節,最大能編碼 31 位字符,但最新的 UTF-8規范也只使用1-4個字節,最大能編碼21位。
不同平臺對UTF-8的支持不相同,例如低版本的低版本的MySQL只支持到3字節。
?
UTF8mb4
utf8mb4比utf8多了對emoji編碼支持。
?