在最初的時候,Internet上只有一種字符集——ANSI的ASCII字符集,它使用7 bits來表示一個字符,總共表示128個字符,其中包括了英文字母、數字、標點符號等經常使用字符。以後,又進行擴展,使用8 bits表示一個字符,能夠表示256個字符,主要在原來的7 bits字符集的基礎上加入了一些特殊符號例如製表符。
後來,因爲各國語言的加入,ASCII已經不能知足信息交流的須要,所以,爲了可以表示其它國家的文字,各國在ASCII的基礎上制定了本身的字符集,這些從ANSI標準派生的字符集被習慣的統稱爲ANSI字符集,它們正式的名稱應該是MBCS(Multi-Byte Chactacter System,即多字節字符系統)。這些派生字符集的特色是以ASCII 127 bits爲基礎,兼容ASCII 127,他們使用大於128的編碼做爲一個LeadingByte,緊跟在Leading Byte後的第二(甚至第三)個字符與Leading Byte一塊兒做爲實際的編碼。這樣的字符集有不少,咱們常見的GB-2312就是其中之一。html
本來標準字符集爲8位的ASCII碼,但世界上的書寫語言不能簡單地用256個8位代碼即一字節表示,就試更寬的值,例如16位值。這就是Unicode很是簡單的原理。與混亂的256字符代碼映射,以及含有一些單字節代碼和一些雙字節代碼的雙字節字符集不一樣,Unicode是統一的16位系統,標準的Unicode稱爲UTF-16。後來爲了雙字節的Unicode可以在現存的處理單字節的系統上正確傳輸,出現了UTF-8,使用相似MBCS的方式對Unicode進行編碼。注意UTF-8是編碼,它屬於Unicode字符集。Unicode字符集有多種編碼形式,而ASCII只有一種,大多數MBCS(包括GB-2312)也只有一種。Unicode的最初目標,是用1個16位的編碼來爲超過65000字符提供映射。但這還不夠,它不能覆蓋所有歷史上的文字,也不能解決傳輸的問題 (implantation head-ache's),尤爲在那些基於網絡的應用中。已有的軟件必須作大量的工做來程序16位的數據。所以,Unicode用一些基本的保留字符制定了三套編碼方式。它們分別是UTF-8,UTF-16和UTF-32。正如名字所示,在UTF-8中,字符是以8位序列來編碼的,用一個或幾個字節來表示一個字符。這種方式的最大好處,是UTF-8保留了ASCII字符的編碼作爲它的一部分,例如,在UTF-8和ASCII中,「A」的編碼都是0x41.UTF-16和UTF-32分別是Unicode的16位和32位編碼方式。考慮到最初的目的,一般說的Unicode就是指UTF-16。網絡
這樣就容許表示65536個字符。在這裏會高興地告訴你前128個Unicode字符(16位代碼從0x0000到0x007F)是ASCII碼,而接下來的128個Unicode字符(代碼從0X0080到0X00FF)是ISO 8859-1對ASCII的擴展。Unicode中不一樣部分的字符都一樣基於現有的標準。
Unicode對錶示全部字符及世界上使用象形文字的語言,包括一些列的數字、符號和貨比的集合來講用16位來表示是充裕的,所以Unicode包含了世界上全部的字母、符號、數字以及中文等在內的字符。編碼
Unicode有缺點嗎?固然有。Unicode字符使用固定的16位存儲,其字符串佔用的內存是ASCII字符串的兩倍,由於本地程序及文件常須要壓縮存儲。
寬字符不須要Unicode,Unicode是一種可能的寬字符編碼。spa
因爲有些符號用8位即一個字節就能夠表示,若使用Unicode字符集用16位表示,會形成內存空間浪費。所以提出多字節字符集 (MBCS),字符的寬度能夠是一個字節,也但是兩個字節或多個字節。這些多字節字符集按單字節值對待,其中一些字符改變了後續字符的含義。若是字符的寬度是兩個字節,那麼它的第一個字節就是一個特殊的「前導字節」,該字節是根據所使用的代碼頁從某個特定範圍選定的。前導字節和「尾字節」合起來指定一個惟一的字符編碼。.net
參考:https://blog.csdn.net/u011028345/article/details/77429822code
https://blog.csdn.net/lichao_526/article/details/79169968htm