計算機內全部信息都是使用0和1進行表示的。html
對於一個短路來講,0表明關,1表明開。那把這些電路組合起來就能夠有長串0和1組成的二進制數字,咱們對這些數字進行編碼和解碼,咱們就能用它來表示咱們想要表示的東西了。windows
好比:文字、圖像、視頻等等,就是一組0和1的二進制序列
數組
8位二進制表示1字節網絡
二進制太長,通常轉換爲16進製表示。可使用「8421法」,進行轉換。ui
4位二進制能夠轉爲1位十六進制(1111=>F),2位十六進制表示一字節編碼
1,在 ASCII 階段,單字節字符串使用一個字節存放一個字符(SBCS)。好比,"Bob123" 在內存中爲:spa
42 6F 62 31 32 33 21 //ascii編碼操作系統
B o b 1 2 3 ! //字符 code
2,在使用 ANSI 編碼支持多種語言階段,每一個字符使用一個字節或多個字節來表示(MBCS),所以,
這種方式存放的字符也被稱做多字節字符。每一個漢字佔2個字節,每一個英文和數字字符佔1個字節:視頻
D6 D0 CE C4 31 32 33 00
中 文 1 2 3 \0
3, 在 UNICODE 被採用以後,計算機存放字符串時,改成存放每一個字符在 UNICODE 字符集中的序號。
目前計算機通常使用 2 個字節(16 位)來存放一個序號(DBCS),所以,這種方式存放的字符也被稱做寬字節字符。好比,字符串 "中文123" 在 Windows 下,內存中實際存放的是 5 個序號:
u4e2d u6587 u0031 u0032 u0033 (x64 大端序)
u2d4e u8765 u3100 u3200 u3300 (x86 小端序)
中 文 1 2 3
漢子 ‘中’ u4e2d 11101001 10110001 1001101
ASCII 碼使用指定的7 位或8 位二進制數組合來表示128 或256 種可能的字符。標準ASCII 碼也叫基礎ASCII碼,使用7 位二進制數(剩下的1位二進制爲0)來表示全部的大寫和小寫字母,數字0 到九、標點符號, 以及在美式英語中使用的特殊控制字符。
其中:
1, 0~31及127(共33個)是控制字符或通訊專用字符(其他爲可顯示字符),如控制符:LF(換行)、CR(回車)等
2, 32~126(共95個)是字符(32是空格),其中48~57爲0到9十個阿拉伯數字。
65~90爲26個大寫英文字母,97~122號爲26個小寫英文字母,其他爲一些標點符號、運算符號等。
3 , 在標準ASCII中,其最高位(b7)用做奇偶校驗位。所謂奇偶校驗,是指在代碼傳送過程當中用來檢驗是否出現錯誤的一種方法,通常分奇校驗和偶校驗兩種。奇校驗規定:正確的代碼一個字節中1的個數必須是奇數,若非奇數,則在最高位b7添1;偶校驗規定:正確的代碼一個字節中1的個數必須是偶數,若非偶數,則在最高位b7添1。
4, 後128個稱爲擴展ASCII碼。許多基於x86的系統都支持使用擴展(或「高」)ASCII。擴展ASCII 碼容許將每一個字符的第8 位用於肯定附加的128 個特殊符號字符、外來語字母和圖形符號。[4]
計算機技術到了歐洲,歐洲人發現怎麼咱們的那麼多符號沒有編進去啊!因此歐洲"磚家"坐到了一塊兒,開始討論。發現既然美國人把第一位流出來了,那麼咱們就用128-255的位置好了。
規則:128-159之間爲控制字符,160-255位文字符號,其中包括了西歐語言、希臘語、泰語、阿拉伯語、希伯來語。恰好把美國人給的空間所有用完,世界真美好,謝謝美利堅預留的每個位置。磚家們決定把他們的編碼名稱叫作Latin1,後面因爲歐洲統一制定ISO標準,因此又有了一個ISO的名稱,即ISO-8859-1。
實現方式
• 0-127的全部位置不動,那麼能夠兼容ASCII,二進制位0xxx xxxx • 128-255位置所有用完,二進制位1xxx xxxx
因爲全部的位置所有用完,而歐元符號是在指定標準以後纔出現的,因此在這個碼錶中連歐洲人本身的貨幣符號都沒有辦法放進去。
計算機技術固然也傳到了亞洲大地,好比中國。
中國磚家們坐在一塊兒發現,美國人搞的這個東西真的有問題,預留才128-255的空間,但是咱們的漢字個數遠遠超出了這個數目啊,怎麼辦??後面聰明的中國磚家們發現,只能使用2個字節了,不然真的搞不定。因爲必須和美國原來制定的ASCII不衝突,因此指定了以下規則:
• 若是一個字節中第一位爲0,那麼這就是一個ASCII字符。 • 若是一個字節中第一位爲1,那麼這個是漢字,認定須要2個字節才表示一個編碼的文字。
把這個碼錶叫GB2312這個碼錶中包含漢字6763個和非漢字圖形字符682個。還有不少的空間沒有用到,索性所有預留了吧。實現方式
• 0xxxxxxx:表示爲ASCII字符 • 1xxxxxxx 1xxxxxxx:表示爲漢字
後來,中國磚家們發現,不少的不經常使用漢字沒有在碼錶中,因而添加了不少的漢字進去,這個編碼叫作GBK,實現方式和GB2312是徹底同樣的,兼容GB2312,固然也兼容ASCII。實現方式
• 0xxxxxxx:表示爲ASCII字符 • 1xxxxxxx xxxxxxxx:表示爲漢字
後面再次添加更多的字符進去,再次命名爲GB18030,兼容GBK。因爲漢字不少,2個字節並不能徹底包括進去,因此GB18030採用24位混編的形式。
詳細編碼表能夠參考這個列表。
固然計算機也傳到了日本(JIS)、韓國、臺灣(BIG5)等等地方,你們所有發揮本身的聰明才智,各自實現了本身的編碼。這些編碼都與ASCII兼容,可是相互之間不兼容。
使用 2 個字節來表明一個字符的各類漢字延伸編碼方式,稱爲 ANSI 編碼,又稱爲"MBCS(Muilti-Bytes Charecter Set,多字節字符集)」。
在簡體中文系統下,ANSI 編碼表明 GB2312 編碼,在日文操做系統下,ANSI 編碼表明 JIS 編碼,因此在中文 windows下要轉碼成gb2312,gbk只須要把文本保存爲ANSI編碼便可。 不一樣ANSI編碼之間互不兼容
GB2312標準共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個;同時,GB 2312收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西裏爾字母在內的682個全角字符。
GB 2312的出現,基本知足了漢字的計算機處理須要,它所收錄的漢字已經覆蓋中國大陸99.75%的使用頻率。
對於人名、古漢語等方面出現的罕用字,GB 2312不能處理,這致使了後來GBK及GB 18030漢字字符集的出現。
GB2312編碼就是基於區位碼的,用雙字節編碼表示中文和中文符號。
通常編碼方式是:0xA0+區號,0xA0+位號。
以下表中的 「啊」,區位號是1601(十進制),那麼「啊」字的GB2312編碼就是 0xA0+16 0xA0+01 也就是 0xB0 0xA1 。根據區位碼錶,GB2312的漢字編碼範圍是0xB0A1~0xF7FE
http://www.xuebuyuan.com/8790...
區位碼裏有英文和數字,按道理說是否是也應該是雙字節的呢。而通常狀況下,咱們見到的英文和數字是單字節的,以ASCII編碼,也就是說現代的GBK編碼是兼容ASCII編碼的。
好比一個數字2,對應的二進制是0x32,(00110010),ASCII的2是半角的二
2(區位碼:0318) 0xA3 0xB2。(10100011 10110010)這裏的雙字節2是全角的二,
同一個編碼文件裏,怎麼區分ASCII和中文編碼呢?從ASCII表咱們知道標準ASCII只有128個字符,0~127即0x00~0x7F(0111 1111)。因此區分的方法就是,高字節的最高位爲0則爲ASCII,爲1則爲中文。
Unicode(統一碼、萬國碼、單一碼)是計算機科學領域裏的一項業界標準,包括字符集、編碼方案等。
Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的
它爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼,以知足跨語言、跨平臺進行文本轉換、處理的要求。
1990年開始研發,1994年正式公佈
字節序是指多字節數據在計算機內存中存儲或者網絡
傳輸時各字節的存儲順序。
字節序有兩種,分別是「大端」(Big Endian, BE)和「
小端」(Little Endian, LE)。
CPU處理多字節數的不一樣方式。例如「漢」字的Unicode編碼是6C49。
大端 6C49 (將高序字節存儲在起始地址)
小段 496C (將低序字節存儲在起始地址)
Unicode標準建議用BOM(Byte Order Mark)來區分字節序,即在傳輸字節流前,先傳輸被做爲BOM的字符「零寬無中斷空格」。這個字符的編碼是FEFF,而反過來的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定義的碼位,不該該出如今實際傳輸中。
UTF-8以字節爲編碼單元,沒有字節序的問題。
UTF-16以兩個字節爲編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每一個編碼單元的字節序。
例如收到一個「奎」的Unicode編碼是594E,「乙」的Unicode編碼是4E59。
若是咱們收到UTF-16字節流「594E」,那麼這是「奎」仍是「乙」?
Unicode規範中推薦的標記字節順序的方法是BOM,即Byte Order Mark。
UTF-8是UNICODE的一種變長度的編碼表達方式,
UTF-8就是以8位爲單元對UCS(Unicode Character Set)進行編碼,而UTF-8不使用大尾序和小尾序的形式,每一個使用UTF-8存儲的字符,除了第一個字節外,其他字節的頭兩個比特都是以」10」開始,使文字處理器可以較快地找出每一個字符的開始位置。
第一種:Unicode從 0x0000 到 0x007F 範圍的,是否是有點熟悉?對,其實就是標準ASCII碼裏面的內容,因此直接去掉前面那個字節 0x00,使用其第二個字節(與ASCII碼相同)做爲其編碼,即爲單字節UTF8。
第二種:Unicode從 0x0080 到 0x07FF 範圍的,轉換成雙字節UTF8。
第三種:Unicode從 0x8000 到 0xFFFF 範圍的,轉換成三字節UTF8,通常中文都是在這個範圍裏。
例如「博」字的Unicode編碼是u535a。0x535A在0x0800~0xFFFF之間,因此用3字節模板 1110yyyy 10yyyyxx 10xxxxxx。將535A寫成二進制是:0101 0011 0101 1010,高八位分別代替y,低八位分別代替x,獲得 11100101 10001101 10011010,也就是 0xE58D9A ,這就是博字的UTF8編碼。
第四種:超過雙字節的Unicode目前尚未普遍支持,僅見emoji表情在此範圍。
轉換的時候,將三個byte的數據,前後放入一個24bit的緩衝區中,先來的byte佔高位。數據不足3byte的話,於緩衝區中剩下的bit用0補足。而後,每次取出6(由於2^6=64)個bit,按照其值選擇ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符做爲編碼後的輸出。不斷進行,直到所有輸入數據轉換完成。這麼看來,跟URLEncode也頗有類似之處啊。