這樣一來,我們就又進(jìn)了一步,得到了一個(gè)相對(duì)更好的版本 。但仍有問題沒有解決 。敲入turbonetcfg,會(huì)發(fā)現(xiàn)菜單的邊框字符也被當(dāng)成漢字顯示 。這是因?yàn)椋@種邊框字符是擴(kuò)展字符,也使用了字符的第8位,因而被當(dāng)作漢字來顯示 。例如,單線一的制表符內(nèi)碼為0xC4,當(dāng)連成一條長(zhǎng)線就是由一連串0xC4組成,而0xC4C4正是漢字哪 。于是水平的制表符被一連串的哪字替代了 。要解決這個(gè)問題就非常不容易了,因?yàn)橹票矸姆N類比較多,而且垂直制表符與其后面字符的組合型式又多種多樣,因而很難判斷出相應(yīng)位置的字符是不是制表符,從理論上說,無論采取什么樣的排除算法,都必然存在誤判的情況,因?yàn)榭偞嬖诙x性,沒有充足的條件來推斷出當(dāng)前字符究竟是制表符還是漢字 。
我們一方面尋找更好的排除組合算法,一方面試圖尋找其它的解決方案 。要想從根本上解決定個(gè)問題,必須利用其它的輔助信息,僅僅從緩沖區(qū)的字符來判斷是不夠的 。
經(jīng)過一番努力,我們發(fā)現(xiàn),在UNIX中使用擴(kuò)展字符時(shí),都要先輸出字符轉(zhuǎn)義序列(Escape sequence)來切換當(dāng)前字符集 。字符轉(zhuǎn)義序列是以控制字符Esc為首的控制命令,在UNIX的虛擬終端中完成終端控制命令,這種命令包括,移動(dòng)光標(biāo)座標(biāo)、卷屏、刪除、切換字符集等等 。也就是說在輸出代表制表符的字符串之前,通常是要先輸出特定的字符轉(zhuǎn)義序列 。在console.c里,有根據(jù)字符轉(zhuǎn)義序列命令來記錄字符狀態(tài)的變量 。結(jié)合該變量提供的信息,就可以非常干凈地把制表符與漢字區(qū)別開來 。
在如上思路的指引下,我們又產(chǎn)生了新的解決方案 。經(jīng)過改動(dòng)得到了另一各版本 。在這個(gè)新版本上,turbonetcfg在初次繪制的時(shí)候,制表符與漢字被清晰地區(qū)分開來,結(jié)果是非常正確的 。但還有新的問題存在∶turbonetcfg在重繪的時(shí)候(如切換虛擬終端或是移動(dòng)鼠標(biāo)光標(biāo)的時(shí)候),制表符還是變成了漢字,因?yàn)橹乩L完全依賴于緩沖區(qū),而這時(shí)用來記錄字符集狀態(tài)的變量并不反映當(dāng)前字符集狀態(tài) 。問題還是沒有最終解決 。我們又回到了起點(diǎn) ?!? 看來問題的最終解決手段必須是把字符集的狀態(tài)伴隨每一個(gè)字符存在緩沖區(qū)中 。讓我們來研究一下緩沖區(qū)的結(jié)構(gòu) 。
每一個(gè)字符占用16bit的緩沖區(qū),低8位是ASCII值,完全被利用,高8位包含前景顏色和背景顏色的屬性,也沒有多余的空間可以利用 。因而只能另外開辟新的緩沖區(qū) 。為了保持一致性,我們決定在原來的緩沖區(qū)后面添加相同大小的緩沖區(qū),用來存放是否是漢字的信息 。
也許有讀者會(huì)問,我們只需要為每個(gè)字符添加一bit的信息來標(biāo)志是否是漢字就足夠了,為什么還要開辟與原緩沖區(qū)大小相同的雙倍緩沖區(qū),是不是太浪費(fèi)呢?
我們先放下這個(gè)問題,稍后再作回答 。其實(shí),如果再添加一bit來標(biāo)志是當(dāng)前字符是漢字的左半邊還是右半邊的話,就會(huì)省去掃描屏幕上當(dāng)前整行字符串的工作,這樣一來,編程會(huì)更簡(jiǎn)單 。但是有讀者會(huì)問,即使是這樣,使用8bit總夠用了吧?為什么還要使用16bit呢?
我們的作法是∶用低8位來存放漢字另外一半的內(nèi)碼,用高8位中的2 bit來存放上面所講的輔助信息,高8位的剩余6位可以用來存放漢字或其它編碼方式(如BIG5或日文、韓文)的信息,從而使我們可以實(shí)現(xiàn)同屏顯示多種雙字節(jié)語(yǔ)言的字符而不會(huì)有相互干擾 。另外,在編程時(shí),雙倍緩沖也比較容易計(jì)算 。
這樣我們就回答了如上的兩個(gè)問題 。迄今為止,我們有了一套徹底解決漢字和制表符相互干擾、半個(gè)漢字的刷新、重繪等問題的方案 。剩下的就是具體編程實(shí)現(xiàn)的問題了 。
推薦閱讀
- Linux文件系統(tǒng)被破壞時(shí)的處理方法介紹
- Linux操作系統(tǒng)的內(nèi)存使用機(jī)制研究
- 刪除Linux后如何找回Windows啟動(dòng)菜單
- 如何查看Linux操作系統(tǒng)使用的Shell類型
- Linux的高效的數(shù)據(jù)傳輸技術(shù)-Relay
- Linux操作系統(tǒng)上定時(shí)運(yùn)行Java程序的方法
- 基于Linux操作系統(tǒng)的目錄服務(wù)的實(shí)現(xiàn)
- 基于Linux的虛擬主機(jī)搭建
- win7系統(tǒng)中出現(xiàn)音量圖標(biāo)不見具體處理方法
- 教你制作Linux操作系統(tǒng)的USB啟動(dòng)盤
