官术网_书友最值得收藏!

1.10 表示文本

此時,你已經知道了位是我們在計算機中全部工作的基礎,我們可以用位來表示其他的東西,比如數字。是時候介紹新的東西了:用數字表示其他內容,比如字母和鍵盤上的符號。

1.10.1 ASCII

就像數字表示法一樣,也存在幾個互相競爭的文字表示法。1963年,美國信息交換標準代碼(American Standard Code for Information Interchange, ASCII)從一些文字表示法中脫穎而出,它為鍵盤上的所有符號分配了7位的數字值。例如,65表示大寫的A,66表示大寫的B,以此類推。IBM的擴展二進制編碼的十進制交換碼(Extended Binary-Coded Decimal Interchange Code, EBCDIC)沒有競爭過ASCII碼,它基于用于穿孔卡片機的編碼。EBCDIC中的“BCD”部分代表的是前面提到的二進制編碼的十進制數。ASCII碼表如表1-11所示。

從表1-11中找到字母A,可以看到它的十進制值是65,十六進制值是0x41,也就是八進制的0101。事實證明,由于歷史原因,ASCII字符代碼還是常用八進制。

表1-11 ASCII碼表

ASCII表中有一些很有趣的編碼。它們被稱為控制字符,因為相對于輸出來說,ASCII字符是控制東西的。表1-12展示了它們所代表的內容。

表1-12 ASCII控制字符

其中許多控制字符被用于通信控制。例如,ACK表示“我收到了消息”,NAK表示“我沒有收到消息”。

1.10.2 其他標準的演變

ASCII碼只使用了一段時間,因為它只包含英語所需的字符。早期的計算機大多產自美國,其他的則產自英國。隨著計算機的普及,其他語言的支持需求也越來越大。國際標準化組織(International Standards Organization, ISO)采用了ISO-646標準和ISO-8859標準,這兩個標準基本上還是ASCII,只不過擴展了一些歐洲語言中使用的重音符號和其他雙音符號。日本工業標準(Japanese Industrial Standards, JIS)委員會提出了日文字符專有的JIS X 0201。此外,還有中文標準、阿拉伯文標準等。

產生這些不同標準的原因之一是,當時的位成本比現在高得多,所以7、8個位被打包表示字符。隨著位成本的下降,人們提出了一個較新的標準Unicode,將16位編碼分配給了字符。當時,人們認為16位足以容納地球上所有語言的所有字符,甚至還有剩余空間。后來Unicode已經擴展到了21位(其中有1 112 064個有效值),我們認為21位才能滿足對所有字符的表示,但考慮到我們喜歡創造新的表情符號,標準可能不會持久不修改。

1.10.3 UTF-8

計算機使用8位來存儲一個ASCII字符,因為計算機的設計決定它不適合處理7位的數量。同樣,雖然位成本比過去低廉了很多,但也不至于便宜到隨便使用16位來存儲一個只需要用8位的字母。Unicode通過為字符代碼提供不同的編碼來解決這個問題。編碼是代表另一個位型的位型。我們用位這樣的抽象概念來創建代表字符的數字,然后用其他數字來代表這些數字。你明白我說的“假設”是什么意思了吧?有一種特別的編碼叫作UTF-8(Unicode Transformation Format-8 bit),由美國計算機科學家Ken Thompson和加拿大程序員Rob Pike提出。我們最常使用UTF-8編碼,因為它具有高效率和向后兼容性。UTF-8編碼使每個ASCII字符占8位,這樣就不會占用ASCII數據的額外空間。它對非ASCII字符進行編碼的方式不會破壞使用ASCII碼的程序。

UTF-8將字符編碼為一個8位塊序列,通常稱為八位字節。UTF-8的一個巧妙之處是,第一塊中最重要的數對應序列的長度,因此很容易識別出第一塊。序列的長度很有用,因為它允許程序很容易找到字符邊界。ASCII字符都是7位的,所以每一個字符只需要一個大塊,這對說英語的人來說很方便,因為它比其他需要非ASCII符號的語言更緊湊。

從圖1-16中可以看到,字母A的數字編碼在ASCII碼和Unicode碼中是相同的。為了用UTF-8編碼A,不管是什么編碼,只要適合7位的編碼,都會得到一個UTF-8塊,MSB設置為0。這就是UTF-8中字母A有前導0的原因。π符號的Unicode不適合7位編碼,但適合11位編碼。為了用UTF-8對π編碼,我們使用2個8位塊,第一個塊以110開頭,第二個塊以10開頭,這樣每個塊分別剩余5個位和6個位來保存剩余的編碼。最后,我們看到048-02的Unicode是16位的,所以需要3個UTF-8塊。

圖1-16 UTF-8編碼示例

主站蜘蛛池模板: 富裕县| 黔江区| 买车| 遵义市| 太原市| 贵定县| 龙南县| 柘城县| 苗栗县| 禄劝| 大宁县| 石泉县| 大庆市| 蓬安县| 长子县| 东海县| 荣成市| 黎城县| 澄迈县| 天长市| 固原市| 集贤县| 康平县| 罗甸县| 岳阳县| 临猗县| 洛南县| 南召县| 无锡市| 绵竹市| 常宁市| 兴海县| 邻水| 新昌县| 承德市| 高淳县| 砚山县| 获嘉县| 怀宁县| 永胜县| 容城县|