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

1.2.4 字符的編碼

字符是指計(jì)算機(jī)中使用的字母、數(shù)字、字和符號(hào)。由于計(jì)算機(jī)是以二進(jìn)制的形式存儲(chǔ)和處理數(shù)據(jù),因此字符也必須按特定的規(guī)則進(jìn)行字符編碼以便計(jì)算機(jī)能處理。這里指的字符編碼是指把字符集中的字符編碼為指定集合中某一對(duì)象以便文本在計(jì)算機(jī)中存儲(chǔ)和通過通信網(wǎng)絡(luò)的傳遞。

1.西文字符的編碼

西文字符也都用二進(jìn)制數(shù)來表示。與數(shù)值型數(shù)據(jù)的主要差別是,一切西文字符都是照事先約定的編碼值來表示。計(jì)算機(jī)中最常用的字符編碼是ASCII碼,全名是“美國(guó)國(guó)家信息交換標(biāo)準(zhǔn)代碼”(American Standard Code for Information Interchange),原為美國(guó)國(guó)家標(biāo)準(zhǔn),后來被ISO(國(guó)際標(biāo)準(zhǔn)化組織)采用。ASCII碼于1961年提出,用于在不同計(jì)算機(jī)硬件和軟件系統(tǒng)中實(shí)現(xiàn)數(shù)據(jù)傳輸標(biāo)準(zhǔn)化,在大多數(shù)的小型機(jī)和全部的個(gè)人計(jì)算機(jī)都使用此碼。

ASCII通常為七位碼,共計(jì)為128個(gè)(0、1七位碼),這128個(gè)字符組成如下:

0~31及127(共33個(gè))是控制字符或通信專用字符(其余為可顯示字符),如控制符:LF(換行)、CR(【Enter】鍵)、FF(換頁)、DEL(刪除)、BS(退格)、BEL(響鈴)等;通信專用字符:SOH(文頭)、EOT(文尾)、ACK(確認(rèn))等;ASCII值為8、9、10和13分別轉(zhuǎn)換為退格、制表、換行和【Enter】鍵字符。它們并沒有特定的圖形顯示,但會(huì)依不同的應(yīng)用程序,而對(duì)文本顯示有不同的影響。

32~126(共95個(gè))是字符(32是空格),其中48~57為0到9這十個(gè)阿拉伯?dāng)?shù)字。

65~90為26個(gè)大寫英文字母,97~122號(hào)為26個(gè)小寫英文字母,其余為一些標(biāo)點(diǎn)符號(hào)、運(yùn)算符號(hào)等。

一個(gè)字符的ASCII碼值可直接在ASCII碼表中查到,將字符所在列的代碼(前三位d6d5d4)與其所在行的代碼(后四位d3d2d1d0)拼接在一起,即為該字符的ASCII碼。例如在表中可查得,字母“A”的ASCII碼為1000001(寫成16進(jìn)制在前面要加0為41H),加號(hào)“+”的ASCII碼為0101011(寫成16進(jìn)制在前面要加0為2BH),數(shù)字“3”數(shù)的ASCII碼為00110011(寫成16進(jìn)制在前面要加0為33H)。

注意:在標(biāo)準(zhǔn)ASCII中,其最高位(b7)用作奇偶校驗(yàn)位。所謂奇偶校驗(yàn),是指在代碼傳送過程中用來檢驗(yàn)是否出現(xiàn)錯(cuò)誤的一種方法,一般分奇校驗(yàn)和偶校驗(yàn)兩種。奇校驗(yàn)確保一個(gè)字節(jié)中1的個(gè)數(shù)必須是奇數(shù),校驗(yàn)位為0;若非奇數(shù),則校驗(yàn)位為1。偶校驗(yàn)確保一個(gè)字節(jié)中1的個(gè)數(shù)必須是偶數(shù),校驗(yàn)位為0;若非偶數(shù),則校驗(yàn)位為1。

ASCII字符編碼表如表1-1-3所示。

表1-1-3 ASCII字符編碼表

其中部分ASCII字符解釋如表1-1-4所示。

表1-1-4 ASCII字符解釋

從表1-1-3中,可以看出,在可以打印的字符里,遵循一定的順序排列。例如:

(1)數(shù)字0~9比字母要小,如“7”<“F”。

(2)數(shù)字0比數(shù)字9要小,并按0到9順序遞增,如“3”<“8”。

(3)字母A比字母Z要小,并按A到Z順序遞增,如“A”<“Z”。

(4)同一個(gè)字母的大寫字母比小寫字母要小,如“A”<“a”。

2.漢字的編碼

由于電子計(jì)算機(jī)現(xiàn)有的輸入鍵盤與英文打字機(jī)鍵盤完全兼容,但對(duì)其他字符的支持不夠友好,因而如何輸入漢字或者其他非拉丁字符一直是多年來人們研究的課題。從處理流程上來說,漢字信息處理系統(tǒng)一般包括編碼、輸入、存儲(chǔ)、編輯、輸出和傳輸,其中最關(guān)鍵的是編碼。

計(jì)算機(jī)中漢字的表示也是用二進(jìn)制編碼。根據(jù)應(yīng)用目的的不同,漢字編碼分為外碼、交換碼、機(jī)內(nèi)碼和字形碼。

漢字系統(tǒng)對(duì)每個(gè)漢字預(yù)先規(guī)定輸入計(jì)算機(jī)中的代碼,即漢字的外部碼(例如拼音輸入碼)。計(jì)算機(jī)為了識(shí)別漢字,要把漢字的輸入碼轉(zhuǎn)換成國(guó)標(biāo)碼再轉(zhuǎn)換成內(nèi)部碼(二進(jìn)制代碼)進(jìn)行存儲(chǔ)和處理。輸出時(shí),將漢字的內(nèi)部碼轉(zhuǎn)換成漢字的字形碼。計(jì)算機(jī)處理漢字的過程如圖1-1-2所示。

圖1-1-2 漢字的計(jì)算機(jī)處理漢字的過程

1)外碼(輸入碼)

外碼也叫輸入碼,是用來將漢字輸入到計(jì)算機(jī)中的一組鍵盤符號(hào)。常用的輸入碼有拼音碼五筆字形碼、區(qū)位碼和電報(bào)碼等,一種好的編碼應(yīng)該編碼規(guī)則簡(jiǎn)單、好記易學(xué)、能夠快速輸入等優(yōu)點(diǎn)。

2)交換碼(國(guó)標(biāo)碼)

計(jì)算機(jī)內(nèi)部處理的信息,都是用二進(jìn)制代碼表示的,漢字也不例外。為了使二進(jìn)制代碼使用更方便,所以現(xiàn)實(shí)中采用的往往是信息交換碼。中國(guó)標(biāo)準(zhǔn)總局1981年制定了中華人民共和國(guó)國(guó)家標(biāo)準(zhǔn)GB2312—1980《信息交換用漢字編碼字符集—基本集》(即國(guó)標(biāo)碼)。

區(qū)位碼是國(guó)標(biāo)碼的另一種表現(xiàn)形式,把國(guó)標(biāo)GB2312—1980中的漢字、圖形符號(hào)組成一個(gè)94×94的方陣,分為94個(gè)“區(qū)”,每個(gè)區(qū)包含94個(gè)“位”,其中“區(qū)”的序號(hào)為01~94,“位”的序號(hào)也是01~94。94個(gè)區(qū)中位置總數(shù)=94×94=8836個(gè),其中7445個(gè)漢字和圖形字符中的每一個(gè)占一個(gè)位置后,還剩下1391個(gè)空位,這1391個(gè)位置空下來保留備用。

區(qū)位碼是一個(gè)4位的十進(jìn)制數(shù),國(guó)標(biāo)碼是一個(gè)4位的十六進(jìn)制數(shù),所以國(guó)標(biāo)碼并不等于區(qū)位碼,它是由區(qū)位碼稍作轉(zhuǎn)換得到,其轉(zhuǎn)換方法為:先將十進(jìn)制區(qū)碼和位碼轉(zhuǎn)換為十六進(jìn)制的區(qū)碼和位碼,這樣就得到了一個(gè)與國(guó)標(biāo)碼有一個(gè)相對(duì)位置差的代碼,再將這個(gè)代碼的第一個(gè)字節(jié)和第二個(gè)字節(jié)分別加上20H,就得到國(guó)標(biāo)碼。例如:“保”字的國(guó)標(biāo)碼為3123H,它的計(jì)算過程如下:

(1)通過查詢區(qū)位碼表,得到“保”字位于第17行,第03列,則區(qū)位碼為1703D。

(2)區(qū)位碼轉(zhuǎn)換為十六進(jìn)制:1703D=(1103)H。

(3)將(2)所得結(jié)果第一個(gè)字節(jié)和第二個(gè)字節(jié)分別加上20H(十進(jìn)制是32,因?yàn)榍?2個(gè)區(qū)已經(jīng)用于表示英文字母、符號(hào)、特殊字符等),最終得到(3123)H就是其對(duì)應(yīng)的國(guó)標(biāo)碼。對(duì)應(yīng)的二進(jìn)制表示就是:(0011000100100011)B。

為了與國(guó)際標(biāo)準(zhǔn)接軌,中華人民共和國(guó)全國(guó)信息技術(shù)標(biāo)準(zhǔn)化技術(shù)委員會(huì)1995年12月1日制定了《漢字內(nèi)碼擴(kuò)展規(guī)范(GBK)》,國(guó)家技術(shù)監(jiān)督局標(biāo)準(zhǔn)化司、電子工業(yè)部科技與質(zhì)量監(jiān)督司1995年12月15日聯(lián)合以技監(jiān)標(biāo)函1995 229號(hào)文件的形式,將它確定為技術(shù)規(guī)范指導(dǎo)性文件。目前中文版的Windows XP、Windows 7、Windows 8等都支持GBK編碼方案。

3)機(jī)內(nèi)碼

根據(jù)國(guó)標(biāo)碼的規(guī)定,每一個(gè)漢字都有了確定的二進(jìn)制代碼,在微機(jī)內(nèi)部漢字代碼都用機(jī)內(nèi)碼,在磁盤上記錄漢字代碼也使用機(jī)內(nèi)碼。

國(guó)標(biāo)碼是漢字信息交換的標(biāo)準(zhǔn)編碼,但因其前后字節(jié)的最高位為0,與ASCII碼發(fā)生沖突,比如漢字的國(guó)標(biāo)碼為32H和23H,而西文字符“2”和“#”的ASCII也為32H和23H,假如內(nèi)存中有兩個(gè)字節(jié)為32H和23H,這到底是一個(gè)漢字,還是兩個(gè)西文字符“2”和“#”,于是就出現(xiàn)了二義性,顯然,國(guó)標(biāo)碼是不可能在計(jì)算機(jī)內(nèi)部直接采用的,于是,漢字的機(jī)內(nèi)碼采用變形國(guó)標(biāo)碼,其變換方法為:將國(guó)標(biāo)碼的每個(gè)字節(jié)都加上128(80H,因?yàn)榍?28個(gè)都是ASCII,這樣就避免了沖突),即將兩個(gè)字節(jié)的最高位由0改1,其余7位不變。

【例1-4】以漢字“大”為例,“大”字的區(qū)位碼為2083。

【解】(1)區(qū)號(hào)為20,位號(hào)為83。

(2)將區(qū)位號(hào)2083轉(zhuǎn)換為十六進(jìn)制表示為1453H。

(3)1453H+2020H=3473H,得到國(guó)標(biāo)碼3473H。

(4)3473H+8080H=B4F3H,得到機(jī)內(nèi)碼為B4F3H

4)漢字的地址碼

漢字地址碼是指漢字庫(kù)中存儲(chǔ)漢字字形信息的邏輯地址碼。

當(dāng)需要向輸出設(shè)備輸出漢字時(shí),先通過地址碼對(duì)漢字庫(kù)進(jìn)行訪問,獲取漢字的字形碼,從而顯示出漢字。因?yàn)樵跐h字庫(kù)中,字形信息大多數(shù)都是按標(biāo)準(zhǔn)漢字交換碼中漢字的排列順序排列,所以漢字的地址碼也是連續(xù)存放在存儲(chǔ)介質(zhì)上,而且與漢字內(nèi)碼有著簡(jiǎn)單的對(duì)應(yīng)關(guān)系,以簡(jiǎn)化內(nèi)碼到地址碼的轉(zhuǎn)換。

5)漢字的字形碼

漢字最終是要通過輸出設(shè)備進(jìn)行輸出便于閱讀或者打印等,那么就必須將漢字內(nèi)碼轉(zhuǎn)成方便人們閱讀的塊狀漢字,漢字字形碼又稱漢字字模,也可以稱作漢字的輸出碼,用于漢字在顯示屏或打印機(jī)上的輸出。

漢字字形碼通常有兩種表示方式:點(diǎn)陣和矢量表示方法。輸出漢字時(shí)都采用圖形方式,無論漢字的筆畫多少,每個(gè)漢字都可以寫在同樣大小的方塊中。通常簡(jiǎn)易型的漢字用16×16點(diǎn)陣來顯示漢字,普通型漢字可以采用24×24點(diǎn)陣或者48×48點(diǎn)陣來表示,為了適應(yīng)高清顯示,現(xiàn)在的最高能做到256×256點(diǎn)陣等。點(diǎn)陣規(guī)模愈大,字形愈清晰美觀,所占存儲(chǔ)空間也愈大。

為了更加形象地說明字形碼,這里以漢字“你”的16×16點(diǎn)陣為例,其字模信息如圖1-1-3所示。

圖1-1-3 漢字的點(diǎn)陣字形碼

在16×16的點(diǎn)陣中用點(diǎn)描出一個(gè)漢字,如“你”,計(jì)算機(jī)將整個(gè)點(diǎn)陣分成16列16行。每個(gè)點(diǎn)都用一位二進(jìn)制編碼表示,如果該點(diǎn)被用于顯示則表示1,否則表示0。這樣,在每一行中需要16個(gè)二進(jìn)制位,也就是2B。在此點(diǎn)陣模式下,描述一個(gè)漢字就需要32B,即占用32B空間。字形碼和具體的字體有關(guān),一般不同的字體有不同的字庫(kù),所以,字模點(diǎn)陣只能是用來構(gòu)成“字庫(kù)”,而不能作為字的機(jī)內(nèi)碼。

點(diǎn)陣式的表示方式容易理解和處理,但是其缺點(diǎn)也很明顯,就是存在鋸齒現(xiàn)象。還有另外一種表示方式——矢量式,它主要是保持漢字的精調(diào)和輪廓,其中輪廓用來描述字體的基本結(jié)構(gòu),而精調(diào)是借助一系列技術(shù),對(duì)字體進(jìn)行微調(diào),從而使得字體更加清晰美觀。

主站蜘蛛池模板: 肥东县| 中方县| 和平区| 万州区| 枣强县| 山西省| 山西省| 长海县| 玉环县| 兰溪市| 如东县| 温州市| 瑞金市| 吕梁市| 苏尼特左旗| 巴东县| 长兴县| 河西区| 巴南区| 青河县| 霍林郭勒市| 卓资县| 当雄县| 滁州市| 鄂温| 江西省| 福海县| 磐石市| 襄汾县| 广水市| 卓尼县| 余姚市| 绥宁县| 宜宾市| 江华| 大埔区| 孟连| 句容市| 大竹县| 卫辉市| 汝南县|