前端系統(tǒng)班 - 02. 計(jì)算機(jī)是如何存儲(chǔ)數(shù)據(jù)的

課程 01:

編程基礎(chǔ):

首先成為程序員,再成為前端開(kāi)發(fā)工程師。而一個(gè)程序員需要知道:

  • 硬件與軟件:計(jì)算機(jī)的運(yùn)行原理;(薦書(shū)《編碼》)
  • 最大的軟件:操作系統(tǒng);
  • 自己寫(xiě)軟件:數(shù)據(jù)結(jié)構(gòu)和算法;(薦書(shū)《數(shù)據(jù)結(jié)構(gòu)與算法結(jié)構(gòu)》)
  • 多人寫(xiě)軟件:軟件工程。(薦書(shū)《代碼大全》)

前端為什么學(xué)編程基礎(chǔ)?——防止成為井底之蛙。

計(jì)算機(jī)存儲(chǔ)漢字的過(guò)程:

  1. 內(nèi)存內(nèi)部的電容通過(guò)充電與否來(lái)存儲(chǔ) 0 和 1,存儲(chǔ) 1 就充電,存儲(chǔ) 0 就不充電;而讀取時(shí),電量大于 50% 就識(shí)別為 1,電量小于 50% 就識(shí)別為 0;這樣便實(shí)現(xiàn)了二進(jìn)制數(shù)的存儲(chǔ)。


    RAM 存儲(chǔ) 0 和 1 的過(guò)程
  2. 通過(guò)十進(jìn)制和二進(jìn)制之間的轉(zhuǎn)換,計(jì)算機(jī)便可以只用二進(jìn)制數(shù) 0 和 1 來(lái)存儲(chǔ)十進(jìn)制數(shù);為了方便書(shū)寫(xiě),一般會(huì)將二進(jìn)制數(shù)寫(xiě)為十六進(jìn)制數(shù),因?yàn)閱蝹€(gè)十六進(jìn)制數(shù)正好可以存 4 位二進(jìn)制數(shù)。(擴(kuò)展:負(fù)數(shù)使用補(bǔ)碼形式存儲(chǔ),小數(shù)使用浮點(diǎn)數(shù)形式存儲(chǔ)。
  3. 用數(shù)字可以為字符編號(hào),于是出現(xiàn)了字符集,例如 ASCII(美國(guó)信息交換標(biāo)準(zhǔn)代碼);按照這個(gè)標(biāo)準(zhǔn),如果要存儲(chǔ)字母 a,那么就存儲(chǔ)十進(jìn)制數(shù) 97 對(duì)應(yīng)的二進(jìn)制數(shù) 0110 0001(十六進(jìn)制數(shù)為 61)。
  4. 既然可以存儲(chǔ)字符,那么漢字也不是問(wèn)題,擴(kuò)充字符集就可以了,將每個(gè)漢字對(duì)應(yīng)不同的編號(hào)。例如最早的漢字字符集 GB2312 (中國(guó)國(guó)家標(biāo)準(zhǔn)簡(jiǎn)體中文字符集),和一度被廣泛使用的微軟推出的 GBK 字符集。
  5. 為了統(tǒng)一存儲(chǔ)世界上所有的字符,Unicode 聯(lián)盟推出了 Unicode 字符集 。
  6. 解決了所有字符的存儲(chǔ)方法,但還缺乏一種高性價(jià)比的存儲(chǔ)方式,于是出現(xiàn)了字符編碼。如果使用 Unicode 字符集最初的低效方式,存儲(chǔ)字母 a 和漢字“你”的方式如下:
    a => 00000000 00000000 00000000 01100001 = 0061
    你 => 00000000 00000000 01001111 01100000 = 4F60
    這樣的方式浪費(fèi)了存儲(chǔ)資源,從而出現(xiàn)了比較節(jié)省存儲(chǔ)資源的方式——字符編碼:
    a => 01100001
    你 => 11100100 10111101 10100000
    當(dāng)存儲(chǔ)的是單個(gè)字母的時(shí)候,使用 1 個(gè)字節(jié)(Byte)來(lái)存儲(chǔ),而存儲(chǔ)漢字或其他字符,則用兩個(gè)或以上的字節(jié)來(lái)存儲(chǔ);第一個(gè)字節(jié)帶有識(shí)別后續(xù)字節(jié)的編碼,后續(xù)字節(jié)的前兩位用來(lái)作為讓第一個(gè)字節(jié)識(shí)別的標(biāo)識(shí),這就是 UTF-8 編碼:
    1字節(jié) 0xxxxxxx
    2字節(jié) 110xxxxx 10xxxxxx
    3字節(jié) 1110xxxx 10xxxxxx 10xxxxxx
    4字節(jié) 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    5字節(jié) 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    6字節(jié) 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

現(xiàn)實(shí)問(wèn)題:

由于歷史原因,早期的軟件和網(wǎng)站是在 GBK 字符集的年代誕生的,而沒(méi)有趕上 Unicode 字符集和 UTF-8 編碼,所以還是有大量應(yīng)用 GBK 字符集的軟件和網(wǎng)站。

也是由于時(shí)間原因,JavaScript 使用了 Unicode 字符集,卻沒(méi)有使用 UTF-8 編碼,所以 ES5 及之前的標(biāo)準(zhǔn)無(wú)法表示 \uFFFF 之后的字符,某些情況下會(huì)出 bug。例如 JavaScript 會(huì)將一個(gè)超出范圍的單個(gè)字符的長(zhǎng)度識(shí)別為 2:

var str1 = '\u1D306';
alert(str1); //?6,一個(gè)字符和數(shù)字字符6;
var str2 = '??';
alert(str2.length); //明明是一個(gè)字符,卻顯示長(zhǎng)度為2;

所以,現(xiàn)在在各種編程當(dāng)中,一定都要用 UTF-8 編碼!

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,836評(píng)論 25 709
  • 本文首發(fā)于 GitChat,現(xiàn)免費(fèi)放出~感謝大家的支持。 我們都知道,大學(xué)幾乎是沒(méi)有 Web 前端課的。以我所在的...
    hylerrix閱讀 5,147評(píng)論 6 60
  • 有好幾次忘記了 在我身旁一同睡醒的一行詩(shī)歌 我以為不再有了 直到路過(guò)一首詩(shī)里的溫暖和眼淚 有好幾次忘記了 用來(lái)喂養(yǎng)...
    屋頂有故事的貓閱讀 258評(píng)論 2 6
  • 選擇一個(gè)人的狂歡,還是一群人的寂寞!
    寫(xiě)程式的貓閱讀 119評(píng)論 0 2
  • 人總是很奇怪,他們和我說(shuō),要知道知足,但是為什么,有時(shí)候我總覺(jué)得心里空空的,我也不知道自己不滿意什么,有一個(gè)貌似表...
    麻花頭閱讀 229評(píng)論 0 0

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