图解编码基础
遠古時代:ascii
A long time ago,米國童鞋想打字了,于是就有了ascii碼。
ascii碼的一個字是8位(一個字節,8個二進制),但是只用后7位(0-127),
英語中一般的字符以及數字、字母;剩下最高位1比特被用作一些通訊系統的奇偶校驗。
輸出下ascii碼
for (byte i = 0; i <= 127; i++)
{
??? Console.Write("{0}-0x{0:x}:{1}{2}", i, (char)i, (i + 1) % 4 == 0 ? "\n" : " ");
}
注意:0x0是nul,代表結束標志'\0'。(修改:之前這里寫的是NULL,多謝peerben童鞋的指出。)
?
可怕的事情發生了:OEM字符集的衍生
米國童鞋憤怒了:“我受夠了每天都只能打這128個字符!不!是127個,第一個什么也不是。啊。。。你妹啊!”。
so!一些不乖的童鞋開始打歪主意了!
一個字節能夠表示的數字(編號)有256個,而ASCII字符只用到了0x00~0x7F,也就是占用了前128個,后面128個數字不用白不用!
這些童鞋各自有各自的想法,這就導致了當時銷往世界各地的機器上出現了大量各式各樣的OEM字符集。
?
東方國度也開始用電腦啦:多字節字符集(MBCS)和中文字符集
時代在進步,東方的國度也開始用電腦了。
對于歐美國家的童鞋來說,也許ascii足夠了,但是對于東方國度,這256個字符遠遠不夠的。
但是東方的人民是無敵的!很快變發明了多字節編碼方式。例如中國使用的就是雙字節字符集編碼。
?
繼續進步!中國的漢字
中國童鞋們的漢字系統是博大精深,數量也是比26個字母多了不知道多少倍,但是一切困難在中國童鞋面前都是紙老虎!是紙老虎!
?
?
GB2312
用于簡體中文,一共收錄了7445個字符,包括6763個漢字和682個其它符號。漢字區的內碼范圍高字節從B0-F7,低字節從A1-FE,占用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。
?
繁體古文怎么辦?big5
用于繁體中文,
?
56個民族是一家!GBK1.0和GB18030
GB2312支持的漢字太少。1995年的漢字擴展規范GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字符。
2000年的GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。從漢字字匯上說,GB18030在GB13000.1的20902個漢字的基礎上增加了CJK擴展A的6582個漢字(Unicode碼0x3400-0x4db5),一共收錄了27484個漢字。
?
混亂的終結!Unicode
太多太多的編碼了,慢慢的,全世界的童鞋們發現沒有個統一的標準是沒法發展進步的,
so!終結者Unicode出現了。
ISO組織的童鞋們對全球混亂的編碼標準已經忍無可忍了,所以他們廢了所有的地區性編碼方案,重新搞一個包括了地球上所有文化、所有字母和符號的編碼!他們打算叫它"Universal Multiple-Octet Coded Character Set",簡稱 UCS, 俗稱 "UNICODE"。
Unicode是2個字節的,簡稱為UCS。現在用的是UCS-2,即2個字節編碼。2個字節最多能夠表示65536個編碼。
這樣太少,所以出現了UCS-4, 即4個字節編碼,由原先的65536個編碼擴展至將近100萬編碼。
?
UTF8,UTF16和UTF32
UTF,即Unicode Transformer Format,是Unicode代碼點(code point)的實際表示方式,按其基本長度所用位數分為UTF-8/16/32。它也可以認為是一種特殊的外部數據編碼,但能夠與Unicode代碼點做一一對應。
?
UTF-8是變長編碼,每個Unicode代碼點按照不同范圍,可以有1-3字節的不同長度。
//UTF-8是壓縮的Unicode編碼方式.
?
UTF-16長度相對固定,只要不處理大于\U200000范圍的字符,每個Unicode代碼點使用16位即2字節表示,超出部分使用兩個UTF-16即4字節表示。按照高低位字節順序,又分為UTF-16BE/UTF-16LE。
?
UTF-32長度始終固定,每個Unicode代碼點使用32位即4字節表示。按照高低位字節順序,又分為UTF-32BE/UTF-32LE。
轉載于:https://www.cnblogs.com/hailan2012/archive/2012/01/12/2320937.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: H3C MSR路由器GRE over I
- 下一篇: SCM系统包含模块