【转】刨根究底字符编码【2.0版】(1):开篇
首先跟大家分享一個(gè)有趣的親身經(jīng)歷。有一次,在網(wǎng)上我看到有程序員發(fā)了一個(gè)帖子,帖子題目乍一看讓人感到驚愕,但細(xì)一想又讓我會心一笑。
這個(gè)帖子的題目大致上是這樣的:字符編碼是不是讓程序員最感到惡心的問題?
更有意思的是,這個(gè)帖子下面竟然還得到了不少程序員的認(rèn)同和點(diǎn)贊。我也表示了認(rèn)同和點(diǎn)了贊。
為什么對字符編碼會有這樣的看法呢?
字符編碼像個(gè)幽靈
字符編碼,看起來是一個(gè)不太受到關(guān)注的邊緣主題,似乎與前端技術(shù)的新潮酷炫、數(shù)據(jù)結(jié)構(gòu)與算法的高大上、Java/Go/MySQL等的實(shí)用都挨不上邊。
但事實(shí)上,字符編碼無疑是計(jì)算機(jī)世界里最基礎(chǔ)、最重要的一個(gè)主題之一。
然而,這么基石性的主題,在計(jì)算機(jī)教材中卻只是浮光掠影般地草草帶過。網(wǎng)絡(luò)上有關(guān)字符編碼的介紹文章也大多錯(cuò)漏百出、謬誤多多。
更為令人不解的是,甚至連一本深入介紹的專門著作都找不到。對此我一直很困惑,為什么就沒有哪位大牛對這個(gè)如此基礎(chǔ)、如此重要而又如此容易讓人困惑的主題寫一本專著進(jìn)行介紹呢?
在編程實(shí)踐中,如果沒有用死磕到底的精神將字符編碼的來龍去脈、前世今生徹底搞清楚,只要你涉及的技術(shù)領(lǐng)域稍微廣泛一些,那么它終將會像幽靈一樣揮之不去,導(dǎo)致時(shí)不時(shí)地被各種與它相關(guān)的“靈異”事件折磨得死去活來。
本人正是在經(jīng)受了字符編碼所帶來的種種令人崩潰的痛苦之后,才在痛定思痛之余,最終痛下決心,誓要將它刨根究底。
字符編碼涉及面廣
字符編碼的基礎(chǔ)性、重要性,主要體現(xiàn)在它的涉及面太過于廣泛。
向下,涉及到計(jì)算機(jī)的底層技術(shù),甚至是硬件實(shí)現(xiàn)。
向上,幾乎跟所有的操作系統(tǒng)、編程語言、應(yīng)用程序都密切相關(guān)。
因此,要想真正搞明白字符編碼問題,必須得從計(jì)算機(jī)的基本概念——位、字節(jié)、字等等開始,再結(jié)合不同的系統(tǒng)環(huán)境與編程環(huán)境,進(jìn)行具體分析。
類似于字符編碼這樣基礎(chǔ)、重要、應(yīng)用廣泛而又特別容易讓人困惑的基石性領(lǐng)域,還有字節(jié)序(即大小端表示)、正則表達(dá)式、浮點(diǎn)數(shù)實(shí)現(xiàn)、日期時(shí)間處理等等。
這些領(lǐng)域,都差不多具有如下共同特點(diǎn):
- 非常基礎(chǔ),卻又非常重要;
- 看起來比較偏門,卻又應(yīng)用極為廣泛;
- 不實(shí)戰(zhàn)的話感覺很簡單,一旦實(shí)際工作中遇到了卻又特別讓人困惑;
- 貌似與日常工作關(guān)系不大,卻又往往會在關(guān)鍵時(shí)刻被它們折磨得死去活來。
真正經(jīng)驗(yàn)老到的技術(shù)負(fù)責(zé)人在招聘技術(shù)人員時(shí),往往不會將面試重點(diǎn)放在對當(dāng)前流行技術(shù)和熱門技術(shù)的考察上,而是會放在對上述這些容易被應(yīng)聘者輕視的基礎(chǔ)技術(shù)的考察上。
道理很簡單,一方面是所謂的“基礎(chǔ)不牢、地動山搖”,基礎(chǔ)技術(shù)的扎實(shí)與否,決定了這個(gè)人未來的技術(shù)成長空間和對新技術(shù)的快速掌握能力。
而另一方面更重要的是,通過對這些看似偏門卻又非常關(guān)鍵的基礎(chǔ)技術(shù)的考察,可以看出一個(gè)人的學(xué)習(xí)能力,以及對技術(shù)真正的好奇心、熱情和追求。
因?yàn)樾鲁薄⒖犰拧衢T的流行技術(shù)幾乎人人都喜歡,因此追逐流行技術(shù)是人之常情,不足為奇。
只有對基礎(chǔ)技術(shù)仍然抱有刨根究底的好奇心和熱情,才真正地體現(xiàn)出了一個(gè)程序員的學(xué)習(xí)能力和技術(shù)追求。
根據(jù)我多年的經(jīng)驗(yàn)來看,這是劃分平庸程序員和優(yōu)秀程序員的分水嶺和分界線,幾乎是百發(fā)百中,極少看走眼過。
壓箱底的看家本領(lǐng)
上面所提到基石性領(lǐng)域中,字節(jié)序、正則表達(dá)式跟字符編碼的關(guān)系又密切相關(guān),尤其是字節(jié)序,直接影響字符編碼的字節(jié)序列。
而由于正則表達(dá)式主要用于在字符串中查找、提取字符或子字符串,要想真正理解正則表達(dá)式,也離不開對字符編碼的深入理解。
因此,對字符編碼的深入理解,是一個(gè)程序員基本功中壓箱底的看家本領(lǐng),是一個(gè)程序員搭建自身技術(shù)體系大廈的重要基石。
為此,我會盡量從日常工作中必然會遇到的各種實(shí)際問題入手,為你順藤摸瓜、抽絲剝繭,環(huán)環(huán)相扣、層層深入,盡可能讓你獲得一種打通了技術(shù)的任督二脈后一氣周流、酣暢淋漓的暢快感,以及徹底搞懂了技術(shù)原理后原來如此、豁然開朗的痛快感。
將涉及到的內(nèi)容
下面是本《刨根究底字符編碼》系列文章將會涉及到的內(nèi)容:
1)關(guān)鍵術(shù)語解釋:位、字節(jié)、字與字長、字符集、編碼、解碼、字符編碼、現(xiàn)代字符編碼模型;
2)字符編碼的由來;
3)ASCII字符編碼方案;
4)擴(kuò)展ASCII字符編碼方案EASCII以及ISO/IEC 8859系列字符編碼方案;
5)漢字編碼方案:GB2312、GBK、GB18030、GB13000、全角與半角、CJK中日韓統(tǒng)一表意文字;
6)漢字編碼中區(qū)位碼、國標(biāo)碼(交換碼)、內(nèi)碼(機(jī)內(nèi)碼)、外碼(輸入碼)、字形碼(輸出碼)的區(qū)別及關(guān)系;
7)ANSI編碼;
8)代碼頁(Code Page)、微軟與ANSI代碼頁;
9)Unicode編碼方案的面世;
10)Unicode編碼方案概述;
11)字符編碼模型的演變與字節(jié)序;
12)Unicode字符集的編碼方式:碼點(diǎn)、碼元、UTF-8、UTF-16、UTF-32;
13)微軟為什么跟聯(lián)通有仇——Windows記事本的字符編碼方式;
14)深入剖析奇葩的Python字符編碼;
15)Vim中的字符編碼問題;
16)Unicode常見問題解答;
17)總結(jié)。
總結(jié)
以上是生活随笔為你收集整理的【转】刨根究底字符编码【2.0版】(1):开篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网申信用卡多久有结果
- 下一篇: 省界收费站撤销怎么缴费?2020高速收费