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

1.11 用字符表示數(shù)字

UTF-8用數(shù)字來表示由代表字符的位組成的數(shù)字。但是我們還沒有完成!現(xiàn)在,我們要用字符來表示其中的一些數(shù)字。在計算機與計算機互相通信的早期,人們希望在計算機之間發(fā)送的不僅僅是文字,還希望發(fā)送二進制數(shù)據(jù)。但在計算機間發(fā)送二進制數(shù)據(jù)并不簡單,因為許多ASCII值都是為控制字符保留的,而且不同系統(tǒng)之間的處理方式不一致。此外,有些系統(tǒng)只支持7位字符的傳輸。

1.11.1 可打印字符引用編碼

可打印字符引用編碼也稱為QP編碼,是一種允許將8位數(shù)據(jù)通過只支持7位數(shù)據(jù)的路徑進行通信的編碼,常用于電子郵件附件。這種編碼允許任何8位的字節(jié)值由3個字符表示:字符“=”后跟一對十六進制數(shù)字(1個數(shù)字對應1個半字節(jié))。當然,這樣做的過程中,“=”具有特殊含義,因此必須用“=3D”代表它,它的值見表1-11。

可打印字符引用編碼有一些額外的規(guī)則。如果制表符和空格字符出現(xiàn)在行尾,必須分別用“=09”和“=20”表示。編碼后數(shù)據(jù)行的長度不能超過76個字符。在行末的“=”是一個軟換行符,當接收方解碼數(shù)據(jù)時會刪除。

1.11.2 Base64編碼

雖然可打印字符引用編碼可以使用,但因為需要三個字符來代表一個字節(jié),它的效率并不高。Base64編碼更有效率,而效率在計算機之間的通信速度比現(xiàn)在慢得多的時候非常重要。Base64編碼將3字節(jié)的數(shù)據(jù)打包分配給4個字符。這3字節(jié)的24位數(shù)據(jù)被分割成4個6位的塊,每個塊分配一個打印字符,如表1-13所示。

表1-13 Base64字符編碼

圖1-17展示了如何將字節(jié)0、1、2編碼為AAEC。

圖1-17 Base64編碼

圖1-17所示的編碼以3字節(jié)為一組,將其轉(zhuǎn)換為4個字符。但不能保證數(shù)據(jù)的長度是3字節(jié)的倍數(shù),因而可以通過填充字符來確保數(shù)據(jù)的長度是3字節(jié)的倍數(shù);如果末尾只有2字節(jié),則會在末尾添加一個“=”,如果末尾只有1字節(jié),則會在末尾添加“==”。

這種編碼也常用于電子郵件附件。

1.11.3 URL編碼

在上文中可以看到,可打印字符引用編碼賦予了“=”字符特殊的權力,編碼中也包含了表示“=”但沒有特殊的功能的機制。網(wǎng)頁URL使用了幾乎同一種模式。

如果你曾經(jīng)檢查過網(wǎng)頁的URL,可能已經(jīng)注意到像%26和%2F這樣的字符序列。這些字符之所以存在是因為它們在URL的上下文中具有特殊含義。但有時我們需要用這些字符作為字面值,換句話說,就是不含特殊的意義。

上一節(jié)提到,字符被表示為一個8位數(shù)據(jù)塊的序列。每個數(shù)據(jù)塊可以用兩個十六進制的字符來表示,如圖1-16所示。URL編碼,也稱為百分制編碼,用%后面跟著其十六進制表示的形式替換字符。

例如,正斜線字符(/)在URL中有特殊的含義。它的ASCII值為47,也就是十六進制中的2F。如果我們需要使用URL中的“/”,而不想觸發(fā)其特殊含義,可以用%2F代替“/”。(因為我們剛剛給%字符賦予了特殊含義,如果想在字面上表示%,需要用%25代替%。)

主站蜘蛛池模板: 邯郸市| 梁山县| 镇远县| 德庆县| 无棣县| 岚皋县| 德钦县| 雷州市| 三明市| 涡阳县| 香河县| 高州市| 米脂县| 普安县| 华容县| 仙居县| 克拉玛依市| 共和县| 紫阳县| 阜宁县| 筠连县| 揭西县| 稷山县| 扬州市| 鲁山县| 双江| 定陶县| 当雄县| 疏附县| 长丰县| 磐石市| 林州市| 临澧县| 蓬莱市| 芦山县| 同仁县| 阿巴嘎旗| 晋宁县| 鄯善县| 盐池县| 双峰县|