位(bit)、字節(jié)(byte)、字符、編碼

一、位/比特位

位/比特位,數(shù)據(jù)存儲(chǔ)的最小單位。每個(gè)二進(jìn)制數(shù)字0或者1就是1個(gè)位。

二、字節(jié)(Byte)

字節(jié)(Byte)是一種計(jì)量單位,表示數(shù)據(jù)量多少,它是計(jì)算機(jī)信息技術(shù)用于計(jì)量存儲(chǔ)容量的一種計(jì)量單位。

8個(gè)位構(gòu)成一個(gè)字節(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)

三、字符

字符是指計(jì)算機(jī)中使用的文字和符號(hào),比如1、2、3、A、B、C、~!·#¥%……—* () ——+、等等。

a、A、中、+、*、の......均表示一個(gè)字符;
一般 utf-8 編碼下,一個(gè)漢字字符占用 3 個(gè) 字節(jié);
一般 gbk 編碼下,一個(gè)漢字字符占用 2 個(gè) 字節(jié);

四、“字節(jié)”與“字符”

它們完全不是一個(gè)維度的概念,所以兩者之間沒(méi)有“區(qū)別”這個(gè)說(shuō)法。不同編碼里,字符和字節(jié)的對(duì)應(yīng)關(guān)系不同:

①ASCII碼中,一個(gè)英文字母(不分大小寫)占一個(gè)字節(jié)的空間,一個(gè)中文漢字占兩個(gè)字節(jié)的空間。一個(gè)二進(jìn)制數(shù)字序列,在計(jì)算機(jī)中作為一個(gè)數(shù)字單元,一般為8位二進(jìn)制數(shù),換算為十進(jìn)制。最小值0,最大值255。

②UTF-8編碼中,一個(gè)英文字符等于一個(gè)字節(jié),一個(gè)中文(含繁體)等于三個(gè)字節(jié)。

③Unicode編碼中,一個(gè)英文等于兩個(gè)字節(jié),一個(gè)中文(含繁體)等于兩個(gè)字節(jié)。
符號(hào):英文標(biāo)點(diǎn)占一個(gè)字節(jié),中文標(biāo)點(diǎn)占兩個(gè)字節(jié)。舉例:英文句號(hào)“.”占1個(gè)字節(jié)的大小,中文句號(hào)“?!闭?個(gè)字節(jié)的大小。

④UTF-16編碼中,一個(gè)英文字母字符或一個(gè)漢字字符存儲(chǔ)都需要2個(gè)字節(jié)(Unicode擴(kuò)展區(qū)的一些漢字存儲(chǔ)需要4個(gè)字節(jié))。

⑤UTF-32編碼中,世界上任何字符的存儲(chǔ)都需要4個(gè)字節(jié)。

五、字符集

即各種各個(gè)字符的集合。也就是說(shuō)漢字,字母(A、b、c)和符號(hào)(空格、引號(hào)..)會(huì)被收入標(biāo)準(zhǔn)中。

六、編碼

utf-8和Unicode實(shí)際上并不是同一個(gè)層次的概念。

規(guī)定每個(gè)“字符”分別用一個(gè)字節(jié)還是多個(gè)字節(jié)存儲(chǔ),用哪些字節(jié)來(lái)存儲(chǔ),這個(gè)規(guī)定就叫做“編碼”。(其實(shí)際是對(duì)字符集中進(jìn)行編碼,即:每個(gè)字符用二進(jìn)制在計(jì)算中表示存儲(chǔ));
通俗的說(shuō):編碼就是按照規(guī)則將字符翻譯成對(duì)應(yīng)的二進(jìn)制數(shù),在計(jì)算器中運(yùn)行存儲(chǔ),用戶看的時(shí)候(比如瀏覽器),再用對(duì)應(yīng)的編碼解析成用戶可看懂的。
1??美國(guó)ASCII碼
在計(jì)算機(jī)發(fā)明的時(shí)候,由于計(jì)算機(jī)只能表示二進(jìn)制的數(shù)據(jù),美國(guó)為了交流通信方便,約定了一個(gè)編碼系統(tǒng),就是ASCII碼,把a(bǔ)bc..xyz...ABC...XYZ...!@#...等字符分別和0,1,2,3,4......對(duì)應(yīng),發(fā)現(xiàn)差不多剛好128個(gè)數(shù),半個(gè)字節(jié)的長(zhǎng)度,為了防止以后需要為新的符號(hào)編碼,于是干脆取一個(gè)字節(jié),最高位置為0,后七位從0-127分別對(duì)每一個(gè)符號(hào)編碼。于是,計(jì)算機(jī)每次讀取一個(gè)字節(jié),然后參照ASCII表把這些編碼翻譯成字符。
【標(biāo)準(zhǔn)ASCII字符集】
有96個(gè)打印字符,和32個(gè)控制字符組成。一共96+32=128個(gè);
用7位二進(jìn)制數(shù)來(lái)對(duì)每1個(gè)字符進(jìn)行編碼;而由于7位還還不夠1個(gè)字節(jié),而電腦的內(nèi)部常用字節(jié)來(lái)用處理,每個(gè)字節(jié)中多出來(lái)的最高位用0替代;
0 000 0000.........................0
0 111 1111..........................127;
從0----127,來(lái)表示128個(gè)ACSii編碼;

比如:
字符 'A'----------在計(jì)算器內(nèi)部用0100 0001 (65)來(lái)表示;
字符'a'-----------在計(jì)算器內(nèi)部用0 110 0001 (97)來(lái)表示;

注意:'10'在計(jì)算器內(nèi)部是沒(méi)有編碼的,因?yàn)樗亲址?,而不是單個(gè)字符。可以分別對(duì)1,0字符編碼存儲(chǔ);

【擴(kuò)展ASCii字符集】將標(biāo)準(zhǔn)的ASCii最高位1,得到十進(jìn)制代碼128---255(1 000 0000----1 111 1111);所以字符集一共有0---255, 256個(gè)字符;

【gb2312字符集】所有漢字字符在計(jì)算機(jī)內(nèi)部采用2個(gè)字節(jié)來(lái)表示,每個(gè)字節(jié)的最高位規(guī)定為1【正好與標(biāo)準(zhǔn)ASCii字符(最高位是0)不重疊,并兼容】,不支持繁體字。所以,gb2312表示漢字的編碼為:129--255 (兩個(gè)字節(jié),每個(gè)字節(jié)最高位是1);小于127的字符,與ASCii編碼相同。

2??歐洲ISO
后來(lái)歐洲人發(fā)現(xiàn)很多符號(hào)(法語(yǔ),德語(yǔ)),ASCII沒(méi)辦法表示,于是他們約定了一套編碼,一個(gè)字節(jié)的長(zhǎng)度,把最高位也用掉了。這套編碼叫ISO。和ASCII表類似,計(jì)算機(jī)也是每次只讀一個(gè)字節(jié),然后按照ISO表,解碼出字符。

3??中國(guó)GBK
中國(guó)漢字有幾萬(wàn)個(gè),常用的有幾千個(gè),沒(méi)有兩個(gè)字節(jié)無(wú)法表示。于是用了兩個(gè)字節(jié)來(lái)表示中文,整出一套GBK。同時(shí)兼容了ASCII編碼。gbk編碼規(guī)定,計(jì)算機(jī)不能在每次都只讀一個(gè)字節(jié)那么死板了,要先看看第一位是不是為0,要是為0的話,就當(dāng)作ASCII碼來(lái)讀入一個(gè)字節(jié),不然的話就讀入兩個(gè)字節(jié)。

【gbk字符集】gb2312的擴(kuò)充,兼容gb2312,除了收錄gb2312所有的字符外,還收錄了其他不常見的漢字、繁體字等。gbk中字符是一個(gè)或兩個(gè)字節(jié),單字節(jié)字符00--7F(0---127)這個(gè)區(qū)間和ASCII是一樣的;雙字節(jié)字符的第一個(gè)字節(jié)是在81--FE(129--254)之間。通過(guò)這個(gè)可以判斷是單字節(jié)還是雙字節(jié),即:在gbk字符編碼,如果第一個(gè)字節(jié)是>128的,則再往后找一個(gè)字節(jié),組成漢字;如果第一個(gè)字節(jié)<128,則表示的是一個(gè)單字節(jié)(此時(shí)和ASCII是一樣的);

4??unicode
如此,各方交流很不方便。這個(gè)時(shí)候,unicode編碼就出現(xiàn)了。這套編碼表的編號(hào)從0一直算到了100多萬(wàn)(三個(gè)字節(jié))。每一個(gè)區(qū)間都對(duì)應(yīng)著一種語(yǔ)言的編碼。目前幾乎收納了全世界大部分的字符。所有的字符都有唯一的編號(hào),這就解決了解碼的沖突。但是,unicode沒(méi)有為編碼的二進(jìn)制傳輸和二進(jìn)制解碼做出規(guī)定。

計(jì)算機(jī)每次讀取三個(gè)字節(jié),參照Unicode表解碼不行嗎?想法是好的,但是如果類似1號(hào)編碼這樣的小數(shù)據(jù)編號(hào)也要三個(gè)字節(jié)的話,即0x000001,這樣很浪費(fèi)。于是,就出現(xiàn)了uft-8,utf-16,utf-32這些編碼方案。utf-16是用兩個(gè)字節(jié)來(lái)編碼所有的字符,utf-32則選擇用4個(gè)字節(jié)來(lái)編碼。下面只講一下utf-8這種解決方案,因?yàn)樗玫淖疃?,用得最多是因?yàn)樵诋?dāng)時(shí)它的方案最好,最節(jié)省資源。

【Unicode字符集】容納世界上所有語(yǔ)言字符和符號(hào)的集合(以及對(duì)應(yīng)的二進(jìn)制數(shù)字)
Unicode只是一個(gè)編碼規(guī)范,目前實(shí)際實(shí)現(xiàn)的unicode編碼只有三種:UTF-8,UCS-2和UTF-16,三種unicode字符集之間可以按照規(guī)范進(jìn)行轉(zhuǎn)換。

utf-8編碼:UTF-8(8-bit Unicode Transformation Format)是一種針對(duì)Unicode的可變長(zhǎng)度字符編碼,也是一種前綴碼。它可以用來(lái)表示Unicode標(biāo)準(zhǔn)中的任何字符,且其編碼中的第一個(gè)字節(jié)仍與ASCII兼容,這使得原來(lái)處理ASCII字符的軟件無(wú)須或只須做少部分修改,即可繼續(xù)使用。因此,它逐漸成為電子郵件、網(wǎng)頁(yè)及其他存儲(chǔ)或發(fā)送文字的應(yīng)用中,優(yōu)先采用的編碼。

utf-8為了節(jié)省資源,采用變長(zhǎng)編碼,編碼長(zhǎng)度從1個(gè)字節(jié)到6個(gè)字節(jié)不等。

看起來(lái),utf-16更加節(jié)省資源,節(jié)省空間。但實(shí)際上,當(dāng)時(shí)互聯(lián)網(wǎng)上絕大部分存在的資源都是英文的,英文在utf-16中也是2個(gè)字節(jié),而在utf-8中則是1個(gè)字節(jié)。在當(dāng)時(shí),顯然是utf-8更加節(jié)省資源?,F(xiàn)在在中文世界里來(lái)比較,則是utf-16更加節(jié)省資源。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 字符是用戶可以讀寫的最小單位。計(jì)算機(jī)所能支持的字符組成的集合,就叫做字符集。字符集通常以二維表的形式存在。二維表的...
    劉惜有閱讀 8,398評(píng)論 2 14
  • 在軟件的編碼和實(shí)現(xiàn)中,我們可能會(huì)碰到個(gè)一個(gè)比較頭疼的問(wèn)題--編碼,不同字符間的編碼和解碼,你確定了解各種字符的編碼...
    Java小鋪閱讀 2,628評(píng)論 0 5
  • 1 關(guān)于開班儀式你是如何理解的? 開班儀式是建國(guó)大典,更是結(jié)婚典禮,還是企業(yè)入職培訓(xùn),無(wú)非宣告未來(lái)我們將走在一起,...
    蘇磊CHIVA閱讀 166評(píng)論 0 0
  • 怎么成為一個(gè)快樂(lè),自信,社會(huì)適應(yīng)能力強(qiáng),情商高的孩子呢?學(xué)習(xí)兒童社會(huì)情感技能(SEL)課程啊! SEL...
    任杰塔娜閱讀 665評(píng)論 1 3
  • 圖 / 欣然文 / 無(wú)影 杏眉倒立,怒目圓睜! 這是要打架了嗎? 你還不還?! 【】 猜一猜,這篇明天能得幾個(gè)鉆?...
    梅心無(wú)影閱讀 601評(píng)論 7 7

友情鏈接更多精彩內(nèi)容