一、位/比特位
位/比特位缘滥,數(shù)據(jù)存儲的最小單位轰胁。每個二進(jìn)制數(shù)字0或者1就是1個位。
二朝扼、字節(jié)(Byte)
字節(jié)(Byte)是一種計量單位赃阀,表示數(shù)據(jù)量多少,它是計算機信息技術(shù)用于計量存儲容量的一種計量單位擎颖。
8個位構(gòu)成一個字節(jié)榛斯。即:1 byte (字節(jié))= 8 bit (位);
1 B = 1 byte(字節(jié));
1 KB = 1024 B(字節(jié));
1 MB = 1024 KB;(2^10 B)
1 GB = 1024 MB;(2^20 B)
1 TB = 1024 GB;(2^30 B)
三肠仪、字符
字符是指計算機中使用的文字和符號肖抱,比如1、2异旧、3意述、A、B、C荤崇、~拌屏!·#¥%……—* () ——+、等等术荤。
a倚喂、A、中瓣戚、+端圈、*、の......均表示一個字符子库;
一般 utf-8 編碼下舱权,一個漢字字符占用 3 個 字節(jié);
一般 gbk 編碼下仑嗅,一個漢字字符占用 2 個 字節(jié)宴倍;
四、“字節(jié)”與“字符”
它們完全不是一個維度的概念仓技,所以兩者之間沒有“區(qū)別”這個說法鸵贬。不同編碼里,字符和字節(jié)的對應(yīng)關(guān)系不同:
①ASCII碼中脖捻,一個英文字母(不分大小寫)占一個字節(jié)的空間阔逼,一個中文漢字占兩個字節(jié)的空間。一個二進(jìn)制數(shù)字序列郭变,在計算機中作為一個數(shù)字單元颜价,一般為8位二進(jìn)制數(shù),換算為十進(jìn)制诉濒。最小值0周伦,最大值255。
②UTF-8編碼中未荒,一個英文字符等于一個字節(jié)专挪,一個中文(含繁體)等于三個字節(jié)。
③Unicode編碼中片排,一個英文等于兩個字節(jié)寨腔,一個中文(含繁體)等于兩個字節(jié)。
符號:英文標(biāo)點占一個字節(jié)率寡,中文標(biāo)點占兩個字節(jié)迫卢。舉例:英文句號“.”占1個字節(jié)的大小,中文句號“冶共∏颍”占2個字節(jié)的大小每界。
④UTF-16編碼中,一個英文字母字符或一個漢字字符存儲都需要2個字節(jié)(Unicode擴展區(qū)的一些漢字存儲需要4個字節(jié))家卖。
⑤UTF-32編碼中眨层,世界上任何字符的存儲都需要4個字節(jié)。
五上荡、字符集
即各種各個字符的集合趴樱。也就是說漢字,字母(A酪捡、b叁征、c)和符號(空格、引號..)會被收入標(biāo)準(zhǔn)中逛薇。
六航揉、編碼
utf-8和Unicode實際上并不是同一個層次的概念。
規(guī)定每個“字符”分別用一個字節(jié)還是多個字節(jié)存儲金刁,用哪些字節(jié)來存儲,這個規(guī)定就叫做“編碼”议薪。(其實際是對字符集中進(jìn)行編碼尤蛮,即:每個字符用二進(jìn)制在計算中表示存儲);
通俗的說:編碼就是按照規(guī)則將字符翻譯成對應(yīng)的二進(jìn)制數(shù)斯议,在計算器中運行存儲产捞,用戶看的時候(比如瀏覽器),再用對應(yīng)的編碼解析成用戶可看懂的哼御。
1??美國ASCII碼
在計算機發(fā)明的時候坯临,由于計算機只能表示二進(jìn)制的數(shù)據(jù),美國為了交流通信方便恋昼,約定了一個編碼系統(tǒng)看靠,就是ASCII碼,把abc..xyz...ABC...XYZ...!@#...等字符分別和0,1,2,3,4......對應(yīng)液肌,發(fā)現(xiàn)差不多剛好128個數(shù)挟炬,半個字節(jié)的長度,為了防止以后需要為新的符號編碼嗦哆,于是干脆取一個字節(jié)谤祖,最高位置為0,后七位從0-127分別對每一個符號編碼老速。于是粥喜,計算機每次讀取一個字節(jié),然后參照ASCII表把這些編碼翻譯成字符橘券。
【標(biāo)準(zhǔn)ASCII字符集】
有96個打印字符额湘,和32個控制字符組成卿吐。一共96+32=128個;
用7位二進(jìn)制數(shù)來對每1個字符進(jìn)行編碼缩挑;而由于7位還還不夠1個字節(jié)但两,而電腦的內(nèi)部常用字節(jié)來用處理,每個字節(jié)中多出來的最高位用0替代供置;
0 000 0000.........................0
0 111 1111..........................127谨湘;
從0----127,來表示128個ACSii編碼芥丧;
比如:
字符 'A'----------在計算器內(nèi)部用0100 0001 (65)來表示紧阔;
字符'a'-----------在計算器內(nèi)部用0 110 0001 (97)來表示;
注意:'10'在計算器內(nèi)部是沒有編碼的续担,因為它是字符串擅耽,而不是單個字符∥镉觯可以分別對1,0字符編碼存儲乖仇;
【擴展ASCii字符集】將標(biāo)準(zhǔn)的ASCii最高位1,得到十進(jìn)制代碼128---255(1 000 0000----1 111 1111)询兴;所以字符集一共有0---255, 256個字符乃沙;
【gb2312字符集】所有漢字字符在計算機內(nèi)部采用2個字節(jié)來表示,每個字節(jié)的最高位規(guī)定為1【正好與標(biāo)準(zhǔn)ASCii字符(最高位是0)不重疊诗舰,并兼容】警儒,不支持繁體字。所以眶根,gb2312表示漢字的編碼為:129--255 (兩個字節(jié)蜀铲,每個字節(jié)最高位是1);小于127的字符属百,與ASCii編碼相同记劝。
2??歐洲ISO
后來歐洲人發(fā)現(xiàn)很多符號(法語,德語)诸老,ASCII沒辦法表示隆夯,于是他們約定了一套編碼,一個字節(jié)的長度别伏,把最高位也用掉了蹄衷。這套編碼叫ISO。和ASCII表類似厘肮,計算機也是每次只讀一個字節(jié)愧口,然后按照ISO表,解碼出字符类茂。
3??中國GBK
中國漢字有幾萬個耍属,常用的有幾千個托嚣,沒有兩個字節(jié)無法表示。于是用了兩個字節(jié)來表示中文厚骗,整出一套GBK示启。同時兼容了ASCII編碼。gbk編碼規(guī)定领舰,計算機不能在每次都只讀一個字節(jié)那么死板了夫嗓,要先看看第一位是不是為0,要是為0的話冲秽,就當(dāng)作ASCII碼來讀入一個字節(jié)舍咖,不然的話就讀入兩個字節(jié)。
【gbk字符集】gb2312的擴充锉桑,兼容gb2312排霉,除了收錄gb2312所有的字符外,還收錄了其他不常見的漢字民轴、繁體字等攻柠。gbk中字符是一個或兩個字節(jié),單字節(jié)字符00--7F(0---127)這個區(qū)間和ASCII是一樣的后裸;雙字節(jié)字符的第一個字節(jié)是在81--FE(129--254)之間辙诞。通過這個可以判斷是單字節(jié)還是雙字節(jié),即:在gbk字符編碼轻抱,如果第一個字節(jié)是>128的,則再往后找一個字節(jié)旦部,組成漢字祈搜;如果第一個字節(jié)<128,則表示的是一個單字節(jié)(此時和ASCII是一樣的)士八;
4??unicode
如此容燕,各方交流很不方便。這個時候婚度,unicode編碼就出現(xiàn)了蘸秘。這套編碼表的編號從0一直算到了100多萬(三個字節(jié))。每一個區(qū)間都對應(yīng)著一種語言的編碼蝗茁。目前幾乎收納了全世界大部分的字符醋虏。所有的字符都有唯一的編號,這就解決了解碼的沖突哮翘。但是颈嚼,unicode沒有為編碼的二進(jìn)制傳輸和二進(jìn)制解碼做出規(guī)定。
計算機每次讀取三個字節(jié)饭寺,參照Unicode表解碼不行嗎阻课?想法是好的叫挟,但是如果類似1號編碼這樣的小數(shù)據(jù)編號也要三個字節(jié)的話,即0x000001限煞,這樣很浪費抹恳。于是,就出現(xiàn)了uft-8署驻,utf-16奋献,utf-32這些編碼方案。utf-16是用兩個字節(jié)來編碼所有的字符硕舆,utf-32則選擇用4個字節(jié)來編碼秽荞。下面只講一下utf-8這種解決方案,因為它用的最多抚官,用得最多是因為在當(dāng)時它的方案最好扬跋,最節(jié)省資源。
【Unicode字符集】容納世界上所有語言字符和符號的集合(以及對應(yīng)的二進(jìn)制數(shù)字)
Unicode只是一個編碼規(guī)范凌节,目前實際實現(xiàn)的unicode編碼只有三種:UTF-8钦听,UCS-2和UTF-16,三種unicode字符集之間可以按照規(guī)范進(jìn)行轉(zhuǎn)換倍奢。
utf-8編碼:UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼朴上,也是一種前綴碼。它可以用來表示Unicode標(biāo)準(zhǔn)中的任何字符卒煞,且其編碼中的第一個字節(jié)仍與ASCII兼容痪宰,這使得原來處理ASCII字符的軟件無須或只須做少部分修改,即可繼續(xù)使用畔裕。因此衣撬,它逐漸成為電子郵件、網(wǎng)頁及其他存儲或發(fā)送文字的應(yīng)用中扮饶,優(yōu)先采用的編碼具练。
utf-8為了節(jié)省資源,采用變長編碼甜无,編碼長度從1個字節(jié)到6個字節(jié)不等扛点。