課程 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ò)程:
-
內(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ò)程 - 通過(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ǔ)。)
- 用數(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)。
- 既然可以存儲(chǔ)字符,那么漢字也不是問(wèn)題,擴(kuò)充字符集就可以了,將每個(gè)漢字對(duì)應(yīng)不同的編號(hào)。例如最早的漢字字符集 GB2312 (中國(guó)國(guó)家標(biāo)準(zhǔn)簡(jiǎn)體中文字符集),和一度被廣泛使用的微軟推出的 GBK 字符集。
- 為了統(tǒng)一存儲(chǔ)世界上所有的字符,Unicode 聯(lián)盟推出了 Unicode 字符集 。
- 解決了所有字符的存儲(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 編碼!
