亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種LinuxVFAT文件系統(tǒng)模塊支持GB18030字符集的方法與流程

文檔序號:12040216閱讀:579來源:國知局
一種Linux VFAT文件系統(tǒng)模塊支持GB18030字符集的方法與流程
一種LinuxVFAT文件系統(tǒng)模塊支持GB18030字符集的方法技術(shù)領(lǐng)域本發(fā)明涉及Linux內(nèi)核對中文字符集支持的技術(shù)領(lǐng)域,具體說是一種LinuxVFAT文件系統(tǒng)模塊支持GB18030字符集的方法。所述GB18030字符集指GB18030-2005字符集。

背景技術(shù):
國家標(biāo)準(zhǔn)GB18030-2000《信息交換用漢字編碼字符集基本集的擴(kuò)充》是我國繼GB2312-1980和GB13000-1993之后最重要的漢字編碼標(biāo)準(zhǔn),是我國計(jì)算機(jī)系統(tǒng)必須遵循的基礎(chǔ)性標(biāo)準(zhǔn)之一。目前,GB18030有兩個(gè)版本:GB18030-2000和GB18030-2005。GB18030-2000是GBK的取代版本,它的主要特點(diǎn)是在GBK基礎(chǔ)上增加了CJK統(tǒng)一漢字?jǐn)U充A的漢字。GB18030-2005的主要特點(diǎn)是在GB18030-2000基礎(chǔ)上增加了CJK統(tǒng)一漢字?jǐn)U充B的漢字。2000年發(fā)布的GB18030-2000,全名是《信息技術(shù)漢字編碼字符集基本集的擴(kuò)充》。GB18030-2000僅規(guī)定了常用非漢字符號和27533個(gè)漢字(包括部首、部件等)的編碼,即:GB18030-2000收錄了27533個(gè)漢字。2005年發(fā)布的GB18030-2005在GB18030-2000的基礎(chǔ)上增加了42711個(gè)漢字和多種我國少數(shù)民族文字的編碼,即:GB18030-2005收錄了70244個(gè)漢字,它的主要目的是為了解決一些生、偏、難字的問題,以及適應(yīng)出版、郵政、戶政、金融、地理信息系統(tǒng)等迫切需要的人名、地名用字問題。GB18030的總編碼空間超過150萬個(gè)碼位,為解決人名、地名用字問題提供了方案,為漢字研究、古籍整理等領(lǐng)域提供了統(tǒng)一的信息平臺基礎(chǔ)。目前,我國大部分計(jì)算機(jī)系統(tǒng)仍然采用GB2312編碼。GB18030與GB2312一脈相承,較好地解決了舊系統(tǒng)向新系統(tǒng)的轉(zhuǎn)換問題,并 且改造成本較小。從我國信息技術(shù)和信息產(chǎn)業(yè)發(fā)展的角度出發(fā),考慮到解決我國用戶的需要及解決現(xiàn)有系統(tǒng)的兼容性和對多種操作系統(tǒng)的支持,采用GB18030是我國目前較好的選擇,而GB13000.1更適用于未來國際間的信息交換??紤]到GB18030和GB13000的兼容問題,標(biāo)準(zhǔn)起草組編制了GB18030與GB13000.1的代碼映射表,使得兩個(gè)編碼體系可以自由轉(zhuǎn)換。同時(shí),還開發(fā)了GB18030基本點(diǎn)陣字型庫。世界許多國家和地區(qū)從方便本國和民族應(yīng)用的角度出發(fā),制定了相應(yīng)的編碼標(biāo)準(zhǔn)和內(nèi)碼體系,如日本的JISX0208和JISX0212,韓國的KSC5601和KSC5657等,這是國際上采用的通行慣例。制定GB18030同樣符合國際慣例,它全面兼容GB2312,在字匯上兼容GB13000.1,可以充分利用已有資源,保證不同系統(tǒng)間的兼容性,最大限度地共享資源,為我國軟件產(chǎn)業(yè)留有巨大的發(fā)展空間??梢韵嘈牛珿B18030的實(shí)施將有利于國產(chǎn)軟件的發(fā)展并形成規(guī)模,使我國的中文信息技術(shù)再上一個(gè)臺階。信息產(chǎn)業(yè)部和原國家質(zhì)量技術(shù)監(jiān)督局于2000年3月17日聯(lián)合發(fā)布了該標(biāo)準(zhǔn),即GB18030-2000《信息技術(shù)信息交換用漢字編碼字符集基本集的擴(kuò)充》。該標(biāo)準(zhǔn)作為國家強(qiáng)制性標(biāo)準(zhǔn)自發(fā)布之日起實(shí)施,過渡期到2001年8月31日止。期間,全國信標(biāo)委曾制定和發(fā)布《漢字?jǐn)U展規(guī)范GBK1.0》,并在MSWindows9x/Me/NT/2000、IBMOS/2的系統(tǒng)中廣泛應(yīng)用。GB18030是國家標(biāo)準(zhǔn),在技術(shù)上是GBK的超集,并與其兼容,因此,GBK將結(jié)束其歷史使命。目前市場上的Linux版本基本上只是做到了支持GB2312字符集,沒有實(shí)現(xiàn)對GB18030字符集的完全支持。隨著Linux系統(tǒng)的廣泛推廣和使用,以及GB18030國家標(biāo)準(zhǔn)的強(qiáng)制執(zhí)行,這必將給用戶帶來極大的不便。

技術(shù)實(shí)現(xiàn)要素:
針對現(xiàn)有技術(shù)中存在的缺陷,本發(fā)明的目的在于提供一種LinuxVFAT文件系統(tǒng)模塊支持GB18030字符集(即GB18030-2005字符集)的方法,為廣大Linux用戶提供完美的中文字符集支持方案,讓用戶使用起來更加方便。為達(dá)到以上目的,本發(fā)明采取的技術(shù)方案是:一種LinuxVFAT文件系統(tǒng)模塊支持GB18030字符集的方法,所述GB18030字符集指GB18030-2005字符集,GB18030字符集包括雙字節(jié)部分和四字節(jié)部分,其特征在于:將字符集劃分為:雙字節(jié)區(qū),字符集中雙字節(jié)部分的21003個(gè)漢字,對應(yīng)到GBK編碼、GB18030編碼和Unicode編碼;四字節(jié)區(qū)擴(kuò)充A,字符集中四字節(jié)部分的CJK統(tǒng)一漢字?jǐn)U充A的6530個(gè)漢字,對應(yīng)到GB18030編碼和Unicode編碼;四字節(jié)區(qū)擴(kuò)充B,字符集中四字節(jié)部分的CJK統(tǒng)一漢字?jǐn)U充B的42711個(gè)漢字,對應(yīng)到GB18030編碼、Unicode編碼和UTF-16編碼;雙字節(jié)區(qū)擴(kuò)充A,字符集中四字節(jié)區(qū)擴(kuò)充A和雙字節(jié)區(qū)中共有的52個(gè)漢字,對應(yīng)到GBK編碼、PUA區(qū)編碼和擴(kuò)充A區(qū)編碼;雙字節(jié)漢字均采取了查表方式,四字節(jié)區(qū)擴(kuò)充A的漢字與Unicode編碼轉(zhuǎn)換以及四字節(jié)區(qū)擴(kuò)充B的漢字與UTF編碼轉(zhuǎn)換均采用算法實(shí)現(xiàn);雙字節(jié)漢字包括雙字節(jié)區(qū)的21003個(gè)漢字和雙字節(jié)區(qū)擴(kuò)充A的52個(gè)漢字。在上述技術(shù)方案的基礎(chǔ)上,當(dāng)采用查表法支持雙字節(jié)漢字時(shí),雙字節(jié)區(qū)是GB18030編碼和Unicode編碼一一對應(yīng);雙字節(jié)區(qū)擴(kuò)充A按以下規(guī)律對應(yīng)Unicode編碼:雙字節(jié),第一個(gè)字節(jié)的值從0x81到0xFE,第二個(gè)字節(jié)的值從0x40到0xFE,但不包括0x7F;對應(yīng)的Unicode編碼規(guī)律為:雙字節(jié),第一個(gè)字節(jié)的值從0x4E到0xFA,第二個(gè)字節(jié)的值從0x00到0xFF。在上述技術(shù)方案的基礎(chǔ)上,將雙字節(jié)Unicode編碼轉(zhuǎn)換為GB18030雙字節(jié)字符編碼,包括如下步驟:(1)接收雙字節(jié)區(qū)或者雙字節(jié)區(qū)擴(kuò)充A的雙字節(jié)Unicode編碼;(2)剝離其高低字節(jié);(3)根據(jù)高字節(jié)值查找字符數(shù)組指針表對應(yīng)的GB18030雙字節(jié)字符編碼字符數(shù)組;(4)根據(jù)低字節(jié)值查找字符數(shù)組指針表里對應(yīng)的GB18030雙字節(jié)字符編碼字符數(shù)組;(5)返回處理結(jié)果;該過程可逆。在上述技術(shù)方案的基礎(chǔ)上,采用2字節(jié)轉(zhuǎn)4字節(jié)算法實(shí)現(xiàn)四字節(jié)區(qū)擴(kuò)充A的漢字的處理;采用4字節(jié)轉(zhuǎn)4字節(jié)算法實(shí)現(xiàn)四字節(jié)區(qū)擴(kuò)充B的漢字的處理。在上述技術(shù)方案的基礎(chǔ)上,當(dāng)VFAT文件系統(tǒng)模塊在讀取Unicode編碼或UTF編碼時(shí),首先檢查編碼類型,根據(jù)編碼類型,來決定是否轉(zhuǎn)換成四字節(jié)區(qū)擴(kuò)充A和四字節(jié)區(qū)擴(kuò)充B的漢字;當(dāng)VFAT文件系統(tǒng)模塊在寫字符集時(shí),首先檢查字符集是否為四字節(jié)區(qū)擴(kuò)充A和四字節(jié)區(qū)擴(kuò)充B,然后決定是否轉(zhuǎn)換為4字節(jié)Unicode編碼或4字節(jié)UTF編碼。在上述技術(shù)方案的基礎(chǔ)上,采用2字節(jié)轉(zhuǎn)4字節(jié)算法支持四字節(jié)區(qū)擴(kuò)充A的漢字,其規(guī)律為,四字節(jié),第一個(gè)字節(jié)的值從0x81到0x82,第二個(gè)字節(jié)的值從0x30到0x39,第三個(gè)字節(jié)從0x81到0xFE,第四個(gè)字節(jié)從0x30到0x39;對應(yīng)的Unicode編碼規(guī)律為,雙字節(jié),第一個(gè)字節(jié)的值從0x34到0x4D,第二個(gè)字節(jié)的值從0x00到0xFF。在上述技術(shù)方案的基礎(chǔ)上,將Unicode編碼轉(zhuǎn)換為四字節(jié)區(qū)擴(kuò)充A的漢字,包括如下步驟:由于四字節(jié)區(qū)擴(kuò)充A中的Unicode編碼被雙字節(jié)擴(kuò)充A的52個(gè)漢字占用了,所以算法中應(yīng)該將雙字節(jié)擴(kuò)充A的52個(gè)漢字排除在外,根據(jù)Unicode編碼確定雙字節(jié)擴(kuò)充A的52個(gè)漢字偏移量X;根據(jù)Unicode編碼規(guī)律,則實(shí)際Unicode編碼減去0x3400,為主 體偏移量Y;兩個(gè)偏移量相減,Z=Y(jié)-X,為總體偏移量;根據(jù)四字節(jié)區(qū)擴(kuò)充A的漢字規(guī)律,其碼位分布如下:四字節(jié)碼位空間中第一字節(jié)相同的區(qū)域稱作一級區(qū),每個(gè)一級區(qū)有12600個(gè)碼位,四字節(jié)碼位空間中第一字節(jié)和第二字節(jié)相同的區(qū)域稱作二級區(qū),每個(gè)二級區(qū)有1260個(gè)碼位,四字節(jié)碼位空間中前三個(gè)字節(jié)相同的區(qū)域稱作三級區(qū),每個(gè)三級區(qū)有10個(gè)碼位;據(jù)此推算各個(gè)字節(jié)的偏移距:m1=Z/12600n1=Z%12600m2=n1/1260n2=n1%1260m3=n2/10n3=n2%10根據(jù)四字節(jié)區(qū)擴(kuò)充A,GB18030的基準(zhǔn)編碼為0x8139EE39,從而:第一字節(jié)的位置是:0x81+m1+第二字節(jié)的進(jìn)位;第二字節(jié)的位置是:0x39+m2+第三字節(jié)的進(jìn)位,高位進(jìn)1;第三字節(jié)的位置是:0xFE+m3+第四字節(jié)的進(jìn)位,高位進(jìn)1;第四字節(jié)的位置是:0x39+n3,高位進(jìn)1;該過程可逆。在上述技術(shù)方案的基礎(chǔ)上,采用4字節(jié)轉(zhuǎn)4字節(jié)算法支持四字節(jié)區(qū)擴(kuò)充B的漢字,其規(guī)律為,四字節(jié),第一個(gè)字節(jié)的值從0x95到0x98,第二個(gè)字節(jié)的值從0x30到0x39,第三個(gè)字節(jié)從0x81到0xFE,第四個(gè)字節(jié)從0x30到0x39;對應(yīng)的Unicode編碼規(guī)律為,三字節(jié),第一個(gè)字節(jié)的值為0x02, 第二個(gè)字節(jié)的值從0x00到0xA6,第三個(gè)字節(jié)的值從0x00到0xFF;對應(yīng)的UTF-16編碼規(guī)律為,四字節(jié),第一個(gè)字節(jié)的值為0XD8,第二個(gè)字節(jié)的值從0x40到0x69,第三個(gè)字節(jié)的值從0xDC到0xDE,第四個(gè)字節(jié)的值從0x00到0xFF。在上述技術(shù)方案的基礎(chǔ)上,將UTF-16的編碼轉(zhuǎn)換為Unicode值時(shí),設(shè)U16為UTF-16編碼,UNI為轉(zhuǎn)換后的Unicode值,(1)先將U16初始化為2個(gè)無符號整數(shù)W1和W2;W1為高16位,W2為低16位;(2)將W1的低10位剝離出來向左偏移10位后,組成UNI的高10位,將W2的低10位剝離出來組成UNI的低10位;(3)UNI的值不會超過20位,且大于0x1FFFF,則UNI的值還需要加上0x10000。在上述技術(shù)方案的基礎(chǔ)上,將Unicode編碼轉(zhuǎn)換為四字節(jié)區(qū)擴(kuò)充B的漢字,包括如下步驟:根據(jù)Unicode編碼規(guī)律,則實(shí)際Unicode編碼減去0x20000,為主體偏移量Y;根據(jù)四字節(jié)區(qū)擴(kuò)充B的漢字規(guī)律,其碼位分布如下:四字節(jié)碼位空間中第一字節(jié)相同的區(qū)域稱作一級區(qū),每個(gè)一級區(qū)有12600個(gè)碼位,四字節(jié)碼位空間中第一字節(jié)和第二字節(jié)相同的區(qū)域稱作二級區(qū),每個(gè)二級區(qū)有1260個(gè)碼位,四字節(jié)碼位空間中前三個(gè)字節(jié)相同的區(qū)域稱作三級區(qū),每個(gè)三級區(qū)有10個(gè)碼位,據(jù)此推算各個(gè)字節(jié)的偏移距:m1=Y(jié)/12600n1=Y(jié)%12600m2=n1/1260n2=n1%1260m3=n2/10n3=n2%10根據(jù)四字節(jié)區(qū)擴(kuò)充B,GB18030的基準(zhǔn)編碼為0x95328236,從而:第一字節(jié)的位置是:0x95+m1+第二字節(jié)的進(jìn)位;第二字節(jié)的位置是:0x32+m2+第三字節(jié)的進(jìn)位,高位進(jìn)1;第三字節(jié)的位置是:0x82+m3+第四字節(jié)的進(jìn)位,高位進(jìn)1;第四字節(jié)的位置是:0x36+n3,高位進(jìn)1;該過程可逆。本發(fā)明所述的LinuxVFAT文件系統(tǒng)模塊支持GB18030字符集的方法,在文件系統(tǒng)層面實(shí)現(xiàn)系統(tǒng)能夠正確識別、顯示和輸入GB18030-2005中文字符集編碼,該方法簡化和減少了為了支持GB18030-2005字符集而帶來的系統(tǒng)開銷,提供有關(guān)多字節(jié)字符和寬字節(jié)字符處理GB18030-2005中文字符集的函數(shù)實(shí)現(xiàn)思路,為廣大Linux用戶提供完美的中文字符集支持方案,讓用戶使用起來更加便捷。附圖說明本發(fā)明有如下附圖:圖1轉(zhuǎn)換GB18030中文字符集處理流程圖;圖2查表法轉(zhuǎn)換GB18030中文字符集流程圖;圖32字節(jié)轉(zhuǎn)4字節(jié)算法轉(zhuǎn)換GB18030中文字符集流程圖;圖44字節(jié)轉(zhuǎn)4字節(jié)算法轉(zhuǎn)換GB18030中文字符集流程圖。具體實(shí)施方式以下結(jié)合附圖對本發(fā)明作進(jìn)一步詳細(xì)說明。本發(fā)明所述的LinuxVFAT文件系統(tǒng)模塊支持GB18030字符集的 方法中,所述GB18030字符集指GB18030-2005字符集。GB18030-2005字符集收錄了70244個(gè)漢字,其中包括GB18030-2000字符集收錄的27533個(gè)漢字。GB18030-2005字符集收錄的70244個(gè)漢字可參見表5。表5GB18030-2005字符集收錄的70244個(gè)漢字本申請將GB18030-2005字符集所包含的漢字分成四個(gè)表(表1~表4):1、雙字節(jié)區(qū),將表5所示的雙字節(jié)部分的21003個(gè)漢字劃分為表1,表1簡稱為雙字節(jié)區(qū),雙字節(jié)區(qū)的漢字可對應(yīng)到GBK編碼、GB18030編碼和Unicode編碼,2、四字節(jié)區(qū)擴(kuò)充A,將表5所示的四字節(jié)部分(四字節(jié)區(qū))的6530個(gè)漢字(CJK統(tǒng)一漢字?jǐn)U充A,簡稱為四字節(jié)區(qū)擴(kuò)充A)劃分為表2,四字節(jié)區(qū)擴(kuò)充A的漢字可對應(yīng)到GB18030編碼和Unicode編碼,3、四字節(jié)區(qū)擴(kuò)充B,將表5所示的四字節(jié)部分(四字節(jié)區(qū))的42711個(gè)漢字(CJK統(tǒng)一漢字?jǐn)U充B,簡稱為四字節(jié)區(qū)擴(kuò)充B)劃分為表3,四字節(jié)區(qū)擴(kuò)充B的漢字可對應(yīng)到GB18030編碼、Unicode編碼和UTF-16編碼,4、雙字節(jié)區(qū)擴(kuò)充A,Unicode編碼的四字節(jié)區(qū)擴(kuò)充A(表2)本 來有6582個(gè)漢字,因?yàn)镚B18030的雙字節(jié)區(qū)(表1)已經(jīng)收錄過其中的52個(gè)漢字,所以本申請中四字節(jié)區(qū)擴(kuò)充A對應(yīng)的表2只有6530個(gè)漢字,將這52個(gè)漢字單獨(dú)劃分為表4,表4簡稱為雙字節(jié)區(qū)擴(kuò)充A。表4列出的這52個(gè)漢字其漢字編碼是Unicode后來新增加的對應(yīng)編碼,需要額外單獨(dú)進(jìn)行轉(zhuǎn)換,故將其單獨(dú)列舉出來。雙字節(jié)區(qū)擴(kuò)充A的漢字可對應(yīng)到GBK編碼、PUA區(qū)編碼和擴(kuò)充A區(qū)編碼。GBK編碼是GB18030編碼的一個(gè)子集,PUA區(qū)編碼、擴(kuò)充A區(qū)編碼其實(shí)就是Unicode編碼。將表1(21003)和表2(6530)合起來就是GB18030-2000要求的27533個(gè)漢字,將表1(21003)、表2(6530)和表3(42711)合起來就是GB18030-2005要求的70244個(gè)漢字。表1雙字節(jié)區(qū)的21003漢字序號漢字GBK(GB18030)編碼Unicode編碼1一D2BB4E002丁B6A14E013丂81404E024七C6DF4E035丄81414E046丅81424E05…………21001﨤FE4CFA2421002﨧FE4DFA2721002﨨FE4EFA2821003﨩FE4FFA29表2四字節(jié)區(qū)擴(kuò)充A的6530漢字序號漢字GB18030編碼Unicode編碼18139EE39340028139EF30340138139EF31340248139EF32340358139EF33340468139EF343405…………6527823587354DB26528823587364DB36529823587374DB46530823587384DB5表3四字節(jié)區(qū)擴(kuò)充B的42711漢字表4雙字節(jié)區(qū)擴(kuò)充A的52個(gè)漢字序號漢字GBK編碼PUA區(qū)編碼擴(kuò)充A區(qū)編碼1FE55E81A34732FE56E81B34473FE5AE81F359E4FE5BE820361A5FE5CE821360E6FE5FE824396E……………49FE9CE8604D1750FE9DE8614D1851FE9EE8624D1952FE9FE8634DAE本發(fā)明所述的LinuxVFAT文件系統(tǒng)模塊支持GB18030字符集的方法,在Linux上面采用VFAT文件系統(tǒng)模塊支持GB18030-2005中文 字符集編碼的方法,并且提供有關(guān)多字節(jié)字符和寬字節(jié)字符處理的函數(shù)實(shí)現(xiàn)思路。本發(fā)明所述的LinuxVFAT文件系統(tǒng)模塊支持GB18030字符集的方法,雙字節(jié)漢字(包括雙字節(jié)區(qū)的21003個(gè)漢字和雙字節(jié)區(qū)擴(kuò)充A的52個(gè)漢字)均采取了查表方式,四字節(jié)區(qū)擴(kuò)充A的漢字與Unicode編碼轉(zhuǎn)換以及四字節(jié)區(qū)擴(kuò)充B的漢字與UTF編碼轉(zhuǎn)換均采用算法實(shí)現(xiàn),該方法簡化和減少了為了支持GB18030字符集而帶來的系統(tǒng)開銷。雙字節(jié)漢字的處理。1),采用查表法實(shí)現(xiàn)雙字節(jié)區(qū)的漢字(表1)的處理;雙字節(jié)區(qū)是GB18030編碼和Unicode編碼一一對應(yīng),可以采用比較簡單的查表法實(shí)現(xiàn);2),采用查表法實(shí)現(xiàn)雙字節(jié)區(qū)擴(kuò)充A的漢字(表4)的處理;雙字節(jié)區(qū)擴(kuò)充A按以下規(guī)律對應(yīng)Unicode編碼:雙字節(jié),第一個(gè)字節(jié)的值從0x81到0xFE,第二個(gè)字節(jié)的值從0x40到0xFE,但不包括0x7F;對應(yīng)的Unicode編碼規(guī)律為:雙字節(jié),第一個(gè)字節(jié)的值從0x4E到0xFA,第二個(gè)字節(jié)的值從0x00到0xFF;將雙字節(jié)Unicode編碼轉(zhuǎn)換為GB18030雙字節(jié)字符編碼,包括如下步驟:(1)接收雙字節(jié)區(qū)或者雙字節(jié)區(qū)擴(kuò)充A的雙字節(jié)Unicode編碼;(2)剝離其高低字節(jié);(3)根據(jù)高字節(jié)值查找字符數(shù)組指針表對應(yīng)的GB18030雙字節(jié)字符編碼字符數(shù)組;(4)根據(jù)低字節(jié)值查找字符數(shù)組指針表里對應(yīng)的GB18030雙字節(jié)字符編碼字符數(shù)組;(5)返回處理結(jié)果;該過程可逆,故若將GB18030雙字節(jié)字符編碼轉(zhuǎn)換為雙字節(jié)Unicode編碼,亦采用同樣的原理,包括如下步驟:(1)接收雙字節(jié)區(qū)或者雙字節(jié)區(qū)擴(kuò)充A的GB18030雙字節(jié)字符編碼;(2)剝離其高低字節(jié);(3)根據(jù)高字節(jié)值查找字符數(shù)組指針表對應(yīng)的雙字節(jié)Unicode編碼字符數(shù)組;(4)根據(jù)低字節(jié)值查找字符數(shù)組指針表里對應(yīng)的Unicode編碼字符編碼;(5)返回處理結(jié)果。四字節(jié)區(qū)擴(kuò)充A和四字節(jié)區(qū)擴(kuò)充B的處理。3),采用2字節(jié)轉(zhuǎn)4字節(jié)算法實(shí)現(xiàn)四字節(jié)區(qū)擴(kuò)充A的漢字(表2)的處理;4),采用4字節(jié)轉(zhuǎn)4字節(jié)算法實(shí)現(xiàn)四字節(jié)區(qū)擴(kuò)充B的漢字(表3)的處理。3)和4)所述的算法分別是指四字節(jié)區(qū)擴(kuò)充A和四字節(jié)區(qū)擴(kuò)充B里面的GB18030編碼向Unicode編碼轉(zhuǎn)換的算法。當(dāng)VFAT文件系統(tǒng)模塊在讀取Unicode編碼或UTF編碼時(shí),首先檢查編碼類型,根據(jù)編碼類型,來決定是否轉(zhuǎn)換成四字節(jié)區(qū)擴(kuò)充A和四字節(jié)區(qū)擴(kuò)充B的漢字;當(dāng)VFAT文件系統(tǒng)模塊在寫字符集時(shí),首先檢查字符集是否為四字節(jié)區(qū)擴(kuò)充A和四字節(jié)區(qū)擴(kuò)充B,然后決定是否轉(zhuǎn)換為4字節(jié)Unicode編碼或4字節(jié)UTF編碼。采用2字節(jié)轉(zhuǎn)4字節(jié)算法支持四字節(jié)區(qū)擴(kuò)充A的漢字,其規(guī)律為,四字節(jié),第一個(gè)字節(jié)的值從0x81到0x82,第二個(gè)字節(jié)的值從0x30到0x39,第三個(gè)字節(jié)從0x81到0xFE,第四個(gè)字節(jié)從0x30到0x39;對應(yīng)的Unicode編碼規(guī)律為,雙字節(jié),第一個(gè)字節(jié)的值從0x34到0x4D,第二個(gè)字節(jié)的值從0x00到0xFF;將Unicode編碼轉(zhuǎn)換為四字節(jié)區(qū)擴(kuò)充A的漢字,包括如下步驟:由于四字節(jié)區(qū)擴(kuò)充A中的Unicode編碼被雙字節(jié)擴(kuò)充A的52個(gè) 漢字占用了,所以算法中應(yīng)該將雙字節(jié)擴(kuò)充A的52個(gè)漢字排除在外,根據(jù)Unicode編碼確定雙字節(jié)擴(kuò)充A的52個(gè)漢字偏移量X(0到52之間);根據(jù)Unicode編碼規(guī)律,則實(shí)際Unicode編碼減去0x3400,為主體偏移量Y;兩個(gè)偏移量相減,Z=Y(jié)-X,為總體偏移量;而根據(jù)四字節(jié)區(qū)擴(kuò)充A的漢字規(guī)律,其碼位分布如下:四字節(jié)碼位空間中第一字節(jié)相同的區(qū)域稱作一級區(qū),每個(gè)一級區(qū)有12600個(gè)碼位,即:10*126*10;四字節(jié)碼位空間中第一字節(jié)和第二字節(jié)相同的區(qū)域稱作二級區(qū),每個(gè)二級區(qū)有1260個(gè)碼位,即:126*10;四字節(jié)碼位空間中前三個(gè)字節(jié)相同的區(qū)域稱作三級區(qū),每個(gè)三級區(qū)有10個(gè)碼位;從而可推算各個(gè)字節(jié)的偏移距:m1=Z/12600n1=Z%12600m2=n1/1260n2=n1%1260m3=n2/10n3=n2%10根據(jù)四字節(jié)區(qū)擴(kuò)充A,GB18030的基準(zhǔn)編碼為0x8139EE39,從而:第一字節(jié)的位置是:0x81+m1+第二字節(jié)的進(jìn)位;第二字節(jié)的位置是:0x39+m2+第三字節(jié)的進(jìn)位,高位進(jìn)1;第三字節(jié)的位置是:0xFE+m3+第四字節(jié)的進(jìn)位,高位進(jìn)1;第四字節(jié)的位置是:0x39+n3,高位進(jìn)1;也即是:第一字節(jié)的位置是:0x81+m1+(m2+9)/10;第二字節(jié)的位置是:0x30+(m2+9)%10+(m3+0x10)/17;;第三字節(jié)的位置是:0x81+(m3+0x10)%17+(n3+9)/10;第四字節(jié)的位置是:0x30+(n3+9)%10。該過程可逆,故若將四字節(jié)區(qū)擴(kuò)充A的漢字轉(zhuǎn)換為Unicode編碼,亦采用同樣的原理。采用4字節(jié)轉(zhuǎn)4字節(jié)算法支持四字節(jié)區(qū)擴(kuò)充B的漢字,其規(guī)律為,四字節(jié),第一個(gè)字節(jié)的值從0x95到0x98,第二個(gè)字節(jié)的值從0x30到0x39,第三個(gè)字節(jié)從0x81到0xFE,第四個(gè)字節(jié)從0x30到0x39;對應(yīng)的Unicode編碼規(guī)律為,三字節(jié),第一個(gè)字節(jié)的值為0x02,第二個(gè)字節(jié)的值從0x00到0xA6,第三個(gè)字節(jié)的值從0x00到0xFF;對應(yīng)的UTF-16編碼規(guī)律為,四字節(jié),第一個(gè)字節(jié)的值為0XD8,第二個(gè)字節(jié)的值從0x40到0x69,第三個(gè)字節(jié)的值從0xDC到0xDE,第四個(gè)字節(jié)的值從0x00到0xFF;如下表所示:先考慮將UTF-16的編碼轉(zhuǎn)換為Unicode值,假設(shè)U16為UTF-16編碼,UNI為轉(zhuǎn)換后的Unicode值,(1)先將U16初始化為2個(gè)無符號整數(shù)W1(高16位)和W2(低16位);(2)將W1的低10位剝離出來向左偏移10位后,組成UNI的高10位,將W2的低10位剝離出來組成UNI的低10位;(3)UNI的值不會超過20位,且大于0x1FFFF,則UNI的值還需要加上0x10000;這過程用數(shù)字來表示的話,如下:U16=1101100001yyyyyy110111xxxxxxxxxxW1=1101100001yyyyyyW2=110111xxxxxxxxxxUNI=0001yyyyyyxxxxxxxxxx+0x10000=0010yyyyyyxxxxxxxxxx=0x2####然后再考慮將Unicode編碼轉(zhuǎn)換為四字節(jié)區(qū)擴(kuò)充B的漢字(把Unicode值轉(zhuǎn)換為GB18030編碼),包括如下步驟:由于四字節(jié)區(qū)擴(kuò)充B的42711漢字和Unicode間沒有斷層脫節(jié)的地方,所以算法中無其他偏移量影響;根據(jù)Unicode編碼規(guī)律,則實(shí)際Unicode編碼減去0x20000,為主體偏移量Y;而根據(jù)四字節(jié)區(qū)擴(kuò)充B的漢字規(guī)律,其碼位分布如下:四字節(jié)碼位空間中第一字節(jié)相同的區(qū)域稱作一級區(qū),每個(gè)一級區(qū)有12600個(gè)碼位,即:10*126*10;四字節(jié)碼位空間中第一字節(jié)和第二字節(jié)相同的區(qū)域稱作二級區(qū),每個(gè)二級區(qū)有1260個(gè)碼位,即:126*10;四字節(jié)碼位空間中前三個(gè)字節(jié)相同的區(qū)域稱作三級區(qū),每個(gè)三級區(qū)有10個(gè)碼位;從而可推算各個(gè)字節(jié)的偏移距:m1=Y(jié)/12600n1=Y(jié)%12600m2=n1/1260n2=n1%1260m3=n2/10n3=n2%10根據(jù)四字節(jié)區(qū)擴(kuò)充B,GB18030的基準(zhǔn)編碼為0x95328236,從而:第一字節(jié)的位置是:0x95+m1+第二字節(jié)的進(jìn)位;第二字節(jié)的位置是:0x32+m2+第三字節(jié)的進(jìn)位,高位進(jìn)1;第三字節(jié)的位置是:0x82+m3+第四字節(jié)的進(jìn)位,高位進(jìn)1;第四字節(jié)的位置是:0x36+n3,高位進(jìn)1;也即是:第一字節(jié)的位置是:0x95+m1+(m2+9)/10;第二字節(jié)的位置是:0x30+(m2+9)%10+(m3+0x10)/17;;第三字節(jié)的位置是:0x82+(m3+0x10)%17+(n3+9)/10;第四字節(jié)的位置是:0x30+(n3+9)%10。該過程可逆,故若將四字節(jié)區(qū)擴(kuò)充B的漢字轉(zhuǎn)換為UTF-16編碼,亦采用同樣的原理。以下具體實(shí)例以小端體系結(jié)構(gòu)為準(zhǔn)。(在計(jì)算機(jī)體系結(jié)構(gòu)中,根據(jù)字節(jié)數(shù)據(jù)存儲的位序關(guān)系,可以分為大端體系結(jié)構(gòu)和小端體系結(jié)構(gòu)。所謂的大端體系結(jié)構(gòu),是指數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中;小端體系結(jié)構(gòu)則正好相反。)如圖1所示為轉(zhuǎn)換GB18030中文字符集處理流程圖。步驟如下:步驟101,LinuxVFAT文件系統(tǒng)模塊做好接收Unicode編碼的準(zhǔn)備;步驟102,LinuxVFAT文件系統(tǒng)模塊開始接收Unicode編碼;步驟103,根據(jù)接收的Unicode編碼,查找字符數(shù)組指針表對應(yīng)的雙字節(jié)Unicode編碼字符數(shù)組,判斷是否為雙字節(jié)區(qū)所示的雙字節(jié)區(qū)的21003漢字;如果找到,則轉(zhuǎn)到步驟105,采用查表法轉(zhuǎn)換為GB18030編碼;如果沒有找到,則轉(zhuǎn)到步驟104,繼續(xù)判斷是否為雙字節(jié)區(qū)Unicode編碼;步驟104,根據(jù)接收的Unicode編碼,查找字符數(shù)組指針表對應(yīng)的雙字節(jié)區(qū)擴(kuò)充A的52個(gè)漢字Unicode編碼字符數(shù)組,接著判斷接 收的Unicode編碼判斷是否為雙字節(jié)區(qū)擴(kuò)充A的52個(gè)漢字,如果找到,則轉(zhuǎn)到步驟105,采用查表法轉(zhuǎn)換為GB18030編碼;如果沒有找到,則轉(zhuǎn)到步驟106,判斷是否為四字節(jié)區(qū)擴(kuò)充A的Unicode編碼;步驟105,采用查表法轉(zhuǎn)換為GB18030編碼,然后轉(zhuǎn)到步驟110,返回處理結(jié)果;步驟106,根據(jù)接收的Unicode編碼,查找字符數(shù)組指針表對應(yīng)的四字節(jié)區(qū)擴(kuò)充A的Unicode編碼字符數(shù)組,接著判斷接收的Unicode編碼是否為四字節(jié)區(qū)擴(kuò)充A的6530漢字,如果找到,則轉(zhuǎn)到步驟107,采用2字節(jié)轉(zhuǎn)4字節(jié)算法轉(zhuǎn)換GB18030中文字符集;如果沒有找到,則轉(zhuǎn)到步驟108,接著判斷是否為UTF-16編碼;步驟107,采用2字節(jié)轉(zhuǎn)4字節(jié)算法轉(zhuǎn)換GB18030中文字符集,然后轉(zhuǎn)到步驟110,返回處理結(jié)果;步驟108,根據(jù)接收的Unicode編碼,查找字符數(shù)組指針表對應(yīng)的四字節(jié)區(qū)擴(kuò)充B的Unicode編碼字符數(shù)組,接著判斷接收的Unicode編碼是否為UTF-16編碼,且為四字節(jié)區(qū)擴(kuò)充B四字節(jié)區(qū)擴(kuò)充B的42711漢字,如果找到,則轉(zhuǎn)到步驟109,采用4字節(jié)轉(zhuǎn)4字節(jié)算法轉(zhuǎn)換GB18030中文字符集;如果沒有找到,則轉(zhuǎn)到步驟110,返回處理結(jié)果;步驟109,采用4字節(jié)轉(zhuǎn)4字節(jié)算法轉(zhuǎn)換GB18030中文字符集,然后轉(zhuǎn)到步驟110,返回處理結(jié)果;步驟110,返回處理結(jié)果。進(jìn)一步闡述圖1提及的查表法,如圖2所示為查表法轉(zhuǎn)換GB18030中文字符集流程圖。步驟如下:1)做好接收Unicode編碼的準(zhǔn)備,如步驟201,并開始接收雙字節(jié)區(qū)或者雙字節(jié)區(qū)擴(kuò)充AUnicode編碼,如步驟202;2)剝離該Unicode編碼的高低字節(jié),如步驟203;3)根據(jù)剝離的Unicode編碼的高位字節(jié)數(shù)值,查找字符數(shù)組指針表,定位對應(yīng)的字符數(shù)組,如步驟204;4)如果沒有找到,則報(bào)錯(cuò),進(jìn)入異常處理,如步驟205;5)如果找到,則根據(jù)步驟203剝離的低字節(jié)數(shù)值查找字符數(shù)組表內(nèi)對應(yīng)的GB18030編碼,如步驟206;6)如果沒有找到,則報(bào)錯(cuò),進(jìn)入異常處理,如步驟207;7)如果找到,則將對應(yīng)的GB18030編碼值賦予轉(zhuǎn)換指針,如步驟208;返回處理結(jié)果,如步驟209。進(jìn)一步闡述圖1提及的2字節(jié)轉(zhuǎn)4字節(jié)算法,如圖3所示為2字節(jié)轉(zhuǎn)4字節(jié)算法轉(zhuǎn)換GB18030中文字符集流程圖。步驟如下:1)做好接收Unicode編碼的準(zhǔn)備,如步驟301,并開始接收四字節(jié)區(qū)擴(kuò)充A的Unicode編碼,如步驟302;2)剝離該Unicode編碼的高低字節(jié),如步驟303;3)根據(jù)剝離的Unicode編碼的高位和低位字節(jié)數(shù)值,確認(rèn)是否為四字節(jié)區(qū)擴(kuò)充A的Unicode編碼,如步驟304;4)如果不是,則報(bào)錯(cuò),進(jìn)入異常處理,如步驟305;5)如果是,則確定該Unicode編碼與四字節(jié)區(qū)擴(kuò)充A的基準(zhǔn)Unicode編碼0x3400的偏移量Y,如步驟306;6)確定Unicode編碼與雙字節(jié)區(qū)擴(kuò)充A占用的52個(gè)Unicode編碼的偏移量X,如步驟307;計(jì)算出總偏移量Z=Y(jié)-X,如步驟308;7)根據(jù)總偏移量推算轉(zhuǎn)換后GB18030編碼4個(gè)字節(jié)各個(gè)字節(jié)的偏移量,如步驟309;8)根據(jù)與四字節(jié)區(qū)擴(kuò)充A基準(zhǔn)GB18030編碼第4字節(jié)0x39比較,判斷第4字節(jié)是否進(jìn)位,如步驟310;如果不需要進(jìn)位,則直接給轉(zhuǎn)換后的第4字節(jié)賦值,如步驟311;如果需要進(jìn)位,則在賦值的同時(shí),給第3字節(jié)的偏移量加上1,如步驟312;9)根據(jù)與四字節(jié)區(qū)擴(kuò)充A基準(zhǔn)GB18030編碼第3字節(jié)0xEE比較,判斷第3字節(jié)是否進(jìn)位,如步驟313;如果不需要進(jìn)位,則直接給轉(zhuǎn)換后的第3字節(jié)賦值,如步驟314;如果需要進(jìn)位,則在賦值的 同時(shí),給第2字節(jié)的偏移量加上1,如步驟315;10)根據(jù)與四字節(jié)區(qū)擴(kuò)充A基準(zhǔn)GB18030編碼第4字節(jié)0x39比較,判斷第2字節(jié)是否進(jìn)位,如步驟316;如果不需要進(jìn)位,則直接給轉(zhuǎn)換后的第2字節(jié)賦值,如步驟317;如果需要進(jìn)位,則在賦值的同時(shí),給第1字節(jié)的偏移量加上1,如步驟318;11)在四字節(jié)區(qū)擴(kuò)充A基準(zhǔn)GB18030編碼第1字節(jié)0x91的基礎(chǔ)上,直接給轉(zhuǎn)換后的第1字節(jié)賦值,如步驟319;返回處理結(jié)果,如步驟320。進(jìn)一步闡述圖1提及的4字節(jié)轉(zhuǎn)4字節(jié)算法,如圖4所示為4字節(jié)轉(zhuǎn)4字節(jié)算法轉(zhuǎn)換GB18030中文字符集流程圖。步驟如下:1)做好接收Unicode編碼的準(zhǔn)備,如步驟401,并開始接收四字節(jié)區(qū)擴(kuò)充B的UTF-16編碼,如步驟402;2)剝離該UTF-16編碼的4個(gè)字節(jié),如步驟403;3)根據(jù)剝離的Unicode編碼的4個(gè)字節(jié)數(shù)值,確認(rèn)是否為四字節(jié)區(qū)擴(kuò)充B的UTF-16編碼,如步驟404;如果不是,則報(bào)錯(cuò),進(jìn)入異常處理,如步驟405;4)根據(jù)剝離的Unicode編碼的4個(gè)字節(jié)數(shù)值,確認(rèn)是否為四字節(jié)區(qū)擴(kuò)充B的UTF-16編碼,如步驟404;如果不是,則報(bào)錯(cuò),進(jìn)入異常處理,如步驟405;5)如果是,則根據(jù)剝離的4個(gè)字節(jié)數(shù)值,轉(zhuǎn)換為Unicode值,如步驟406;6)根據(jù)轉(zhuǎn)換后的Unicode值與四字節(jié)區(qū)擴(kuò)充B的基準(zhǔn)Unicode編碼0x20000對比,計(jì)算總偏移量,如步驟407;并推算各個(gè)GB18030編碼的偏移量,如步驟408;7)根據(jù)與四字節(jié)區(qū)擴(kuò)充B基準(zhǔn)GB18030編碼第4字節(jié)0x36比較,判斷第4字節(jié)是否進(jìn)位,如步驟409;如果不需要進(jìn)位,則直接給轉(zhuǎn)換后的第4字節(jié)賦值,如步驟410;如果需要進(jìn)位,則在賦值的同時(shí),給第3字節(jié)的偏移量加上1,如步驟411;8)根據(jù)與四字節(jié)區(qū)擴(kuò)充B基準(zhǔn)GB18030編碼第3字節(jié)0x82比較,判斷第3字節(jié)是否進(jìn)位,如步驟412;如果不需要進(jìn)位,則直接給轉(zhuǎn)換后的第3字節(jié)賦值,如步驟413;如果需要進(jìn)位,則在賦值的同時(shí),給第2字節(jié)的偏移量加上1,如步驟414;9)根據(jù)與四字節(jié)區(qū)擴(kuò)充B基準(zhǔn)GB18030編碼第4字節(jié)0x32比較,判斷第2字節(jié)是否進(jìn)位,如步驟415;如果不需要進(jìn)位,則直接給轉(zhuǎn)換后的第2字節(jié)賦值,如步驟416;如果需要進(jìn)位,則在賦值的同時(shí),給第1字節(jié)的偏移量加上1,如步驟417;10)在四字節(jié)區(qū)擴(kuò)充B基準(zhǔn)GB18030編碼第1字節(jié)0x95的基礎(chǔ)上,直接給轉(zhuǎn)換后的第1字節(jié)賦值,如步驟418;返回處理結(jié)果,如步驟419。本說明書中未作詳細(xì)描述的內(nèi)容屬于本領(lǐng)域?qū)I(yè)技術(shù)人員公知的現(xiàn)有技術(shù)。
當(dāng)前第1頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1