日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

基于Linux系統(tǒng)核心的漢字顯示嘗試( 二 )


1不進(jìn)行conv_uni_to_pc( )的轉(zhuǎn)換 。
2加載符合雙字節(jié)處理的映射關(guān)系,即對非控制字符進(jìn)行1對1的不變映射 。我們自己定制的符合這種映射關(guān)系的UNICODE碼表是direct.uni 。
要想查看/裝載當(dāng)前系統(tǒng)的unicode映射表,可使外部命令loadunimap 。經(jīng)過conv_uni_to_pc( )轉(zhuǎn)換之后,"hello, world.n"中的字符被一個(gè)一個(gè)地填寫到tty1的緩沖區(qū)中 。然后do_con_write( )調(diào)用下層的驅(qū)動(dòng),把緩沖區(qū)中的內(nèi)容輸出到顯示器上(也就相當(dāng)于把緩沖區(qū)的內(nèi)容拷貝到VGA顯存中去) 。

sw->con_putcs(vc_cons〔currcons〕.d, (u16 *)draw_from, (u16
*)draw_to-(u16 *)draw_from, y, draw_x);
之所以要調(diào)用底層驅(qū)動(dòng),是因?yàn)榇嬖诓煌娘@示設(shè)備,其對應(yīng)VGA顯存的存取方式也不一樣 。上面的Sw->con_putcs( )就會(huì)調(diào)用到fbcon.c中的fbcon_putcs()函數(shù)(con_putcs是一個(gè)函數(shù)的指針,在Framebuffer模式下指向fbcon_putcs()函數(shù)) 。也就是說在do_con_write( )函數(shù)中是直接調(diào)用了fbcon_putcs()函數(shù)來進(jìn)行字符的繪制 。比如說在256色模式下,真正負(fù)責(zé)輸出的函數(shù)是:

void fbcon_cfb8_putcs(struct vc_data *conp,
struct display *p,const unsigned short *s, int count, int
yy, int xx)
顯示中文
比如說我們試圖輸出一句中文∶putcs(你好n );(你好的內(nèi)碼為0xc4,0xe3,0xba,0xc3) 。這時(shí)候會(huì)怎么樣呢,有一點(diǎn)可以肯定,"你好"肯定不會(huì)出現(xiàn)在屏幕上,原因有∶核心中沒有漢字字庫,中文顯示就是無米之炊了.
在負(fù)責(zé)字符顯示的void fbcon_cfb8_putcs( )函數(shù)中,原有操作如下∶對于每個(gè)要顯示的字符,依次從虛擬終端緩沖區(qū)中以WORD為單位讀?。ǖ臀蛔止?jié)是ASCII碼,高8位是字符的屬性),由于漢字是雙字節(jié)編碼方式,所以這種操作是不可能顯示出漢字的,只能顯示出xxxx_putcs()是一個(gè)一個(gè)VGA字符 。
要解決的問題∶
確保在do_con_write( )時(shí)uni□pc轉(zhuǎn)換不會(huì)改變原有編碼 。一個(gè)很直接的實(shí)現(xiàn)方式就是加載一個(gè)我們自己定制的UNICODE映射表,loadunimapdirect.uni,或者直接把direct.uni置為核心的缺省映射表 。
針對如上問題,我們要做的第一個(gè)嘗試方案是如下 。
首先需要在核心中加載漢字字庫,然后修改fbcon_cfb8_putcs()函數(shù),在fbcon_cfb8_putcs( )中一次讀兩個(gè)WORD,檢查這兩個(gè)WORD的低位字節(jié)是否能拼成一個(gè)漢字,如果發(fā)現(xiàn)能拼成一個(gè)漢字,就算出這個(gè)漢字在漢字字庫中的偏移,然后把它當(dāng)成一個(gè)16 x 16的VGA字符來顯示 。
試驗(yàn)的結(jié)果表明∶
1能夠輸出漢字,但仍有許多不理想的地方,比如說,輸出以半個(gè)漢字開始的一串漢字,則這半個(gè)漢字后面的漢字都會(huì)是亂碼 。這是半個(gè)漢字的問題 。
2光標(biāo)移動(dòng)會(huì)破壞漢字的顯示 。表現(xiàn)為,光標(biāo)移動(dòng)過的漢字會(huì)變成亂碼 。這是因?yàn)楣鈽?biāo)的更新是通過xxxx_putc( )函數(shù)來完成的 。
xxxx_putc( )函數(shù)與xxxx_putcs( )函數(shù)實(shí)現(xiàn)的功能類似,但是xxxx_putc()函數(shù)只刷新一個(gè)字符而不是一個(gè)字符串,因而xxxx_putc()的輸入?yún)?shù)是一個(gè)整數(shù),而不是一個(gè)字符串的地址 。Xxxx_putc( )函數(shù)的聲明如下∶void fbcon_cfb8_putc(struct vc_data *conp, struct display *p, int c, int yy, int xx)
下一個(gè)嘗試方案就是同時(shí)修改xxxx_putcs( )函數(shù)和xxxx_putc()函數(shù) 。為了解決半個(gè)漢字的問題,每一次輸出之前,都從屏幕當(dāng)前行的起始位置開始掃描,以確定要輸出的字符是否落在半個(gè)漢字的位置上 。如果是半個(gè)漢字的位置,則進(jìn)行相應(yīng)的調(diào)整,即從向前移動(dòng)一個(gè)字節(jié)的位置開始輸出 。
這個(gè)方案有一個(gè)困難,即xxxx_putc( )函數(shù)不用緩沖區(qū)的地址,而是用一個(gè)整數(shù)作為參數(shù) 。所以xxxx_putc( )無法直接利用相鄰的字符來判別該定符是否是漢字 。
解決方案是,利用xxxx_putc( )的光標(biāo)位置參數(shù)(yy, xx),可以逆推出該字符在緩沖區(qū)中的位置 。但仍有一些小麻煩,在Linux的虛擬終端下,用戶可能會(huì)上卷該屏幕(shift pageup),導(dǎo)致光標(biāo)的y座標(biāo)和相應(yīng)字符在緩沖區(qū)的行數(shù)不一致 。相應(yīng)的解決方案是,在逆推的過程中,考慮卷屏的參量 。

推薦閱讀