CN103399843A - 一种Linux VFAT文件系统模块支持GB18030字符集的方法 - Google Patents
一种Linux VFAT文件系统模块支持GB18030字符集的方法 Download PDFInfo
- Publication number
- CN103399843A CN103399843A CN2013103644383A CN201310364438A CN103399843A CN 103399843 A CN103399843 A CN 103399843A CN 2013103644383 A CN2013103644383 A CN 2013103644383A CN 201310364438 A CN201310364438 A CN 201310364438A CN 103399843 A CN103399843 A CN 103399843A
- Authority
- CN
- China
- Prior art keywords
- byte
- district
- nybble
- coding
- unicode
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Document Processing Apparatus (AREA)
Abstract
本发明涉及一种Linux VFAT文件系统模块支持GB18030字符集的方法,所述GB18030字符集指GB18030-2005字符集,将该字符集划分为;双字节区,四字节区扩充A,四字节区扩充B,以及双字节区扩充A,其特征在于:字符集中的双字节汉字均采取了查表方式,四字节区扩充A的汉字与Unicode编码转换以及四字节区扩充B的汉字与UTF编码转换均采用算法实现。本发明所述的方法简化和减少了为了支持GB18030-2005字符集而带来的系统开销,提供有关多字节字符和宽字节字符处理GB18030-2005中文字符集的函数实现思路,为广大Linux用户提供完美的中文字符集支持方案,让用户使用起来更加便捷。
Description
技术领域
本发明涉及Linux内核对中文字符集支持的技术领域,具体说是一种Linux VFAT文件系统模块支持GB18030字符集的方法。所述GB18030字符集指GB18030-2005字符集。
背景技术
国家标准GB18030-2000《信息交换用汉字编码字符集基本集的扩充》是我国继GB2312-1980和GB13000-1993之后最重要的汉字编码标准,是我国计算机系统必须遵循的基础性标准之一。目前,GB18030有两个版本:GB18030-2000和GB18030-2005。GB18030-2000是GBK的取代版本,它的主要特点是在GBK基础上增加了CJK统一汉字扩充A的汉字。GB18030-2005的主要特点是在GB18030-2000基础上增加了CJK统一汉字扩充B的汉字。
2000年发布的GB18030-2000,全名是《信息技术汉字编码字符集基本集的扩充》。GB18030-2000仅规定了常用非汉字符号和27533个汉字(包括部首、部件等)的编码,即:GB18030-2000收录了27533个汉字。2005年发布的GB18030-2005在GB18030-2000的基础上增加了42711个汉字和多种我国少数民族文字的编码,即:GB18030-2005收录了70244个汉字,它的主要目的是为了解决一些生、偏、难字的问题,以及适应出版、邮政、户政、金融、地理信息系统等迫切需要的人名、地名用字问题。GB18030的总编码空间超过150万个码位,为解决人名、地名用字问题提供了方案,为汉字研究、古籍整理等领域提供了统一的信息平台基础。
目前,我国大部分计算机系统仍然采用GB2312编码。GB18030与GB2312一脉相承,较好地解决了旧系统向新系统的转换问题,并 且改造成本较小。从我国信息技术和信息产业发展的角度出发,考虑到解决我国用户的需要及解决现有系统的兼容性和对多种操作系统的支持,采用GB18030是我国目前较好的选择,而GB13000.1更适用于未来国际间的信息交换。考虑到GB18030和GB13000的兼容问题,标准起草组编制了GB18030与GB13000.1的代码映射表,使得两个编码体系可以自由转换。同时,还开发了GB18030基本点阵字型库。
世界许多国家和地区从方便本国和民族应用的角度出发,制定了相应的编码标准和内码体系,如日本的JIS X0208和JIS X0212,韩国的KS C5601和KS C5657等,这是国际上采用的通行惯例。制定GB18030同样符合国际惯例,它全面兼容GB2312,在字汇上兼容GB13000.1,可以充分利用已有资源,保证不同系统间的兼容性,最大限度地共享资源,为我国软件产业留有巨大的发展空间。可以相信,GB18030的实施将有利于国产软件的发展并形成规模,使我国的中文信息技术再上一个台阶。
信息产业部和原国家质量技术监督局于2000年3月17日联合发布了该标准,即GB18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充》。该标准作为国家强制性标准自发布之日起实施,过渡期到2001年8月31日止。
期间,全国信标委曾制定和发布《汉字扩展规范GBK1.0》,并在MS Windows9x/Me/NT/2000、IBM OS/2的系统中广泛应用。GB18030是国家标准,在技术上是GBK的超集,并与其兼容,因此,GBK将结束其历史使命。
目前市场上的Linux版本基本上只是做到了支持GB2312字符集,没有实现对GB18030字符集的完全支持。随着Linux系统的广泛推广和使用,以及GB18030国家标准的强制执行,这必将给用户带来极大的不便。
发明内容
针对现有技术中存在的缺陷,本发明的目的在于提供一种Linux VFAT文件系统模块支持GB18030字符集(即GB18030-2005字符集)的方法,为广大Linux用户提供完美的中文字符集支持方案,让用户使用起来更加方便。
为达到以上目的,本发明采取的技术方案是:
一种Linux VFAT文件系统模块支持GB18030字符集的方法,所述GB18030字符集指GB18030-2005字符集,GB18030字符集包括双字节部分和四字节部分,其特征在于:将字符集划分为:
双字节区,字符集中双字节部分的21003个汉字,对应到GBK编码、GB18030编码和Unicode编码;
四字节区扩充A,字符集中四字节部分的CJK统一汉字扩充A的6530个汉字,对应到GB18030编码和Unicode编码;
四字节区扩充B,字符集中四字节部分的CJK统一汉字扩充B的42711个汉字,对应到GB18030编码、Unicode编码和UTF-16编码;
双字节区扩充A,字符集中四字节区扩充A和双字节区中共有的52个汉字,对应到GBK编码、PUA区编码和扩充A区编码;
双字节汉字均采取了查表方式,四字节区扩充A的汉字与Unicode编码转换以及四字节区扩充B的汉字与UTF编码转换均采用算法实现;
双字节汉字包括双字节区的21003个汉字和双字节区扩充A的52个汉字。
在上述技术方案的基础上,当采用查表法支持双字节汉字时,双字节区是GB18030编码和Unicode编码一一对应;
双字节区扩充A按以下规律对应Unicode编码:双字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x40到0xFE,但不包括0x7F;对应的Unicode编码规律为:双字节,第一个字节的值从0x4E到0xFA,第二个字节的值从0x00到0xFF。
在上述技术方案的基础上,将双字节Unicode编码转换为GB18030双字节字符编码,包括如下步骤:
(1)接收双字节区或者双字节区扩充A的双字节Unicode编码;
(2)剥离其高低字节;
(3)根据高字节值查找字符数组指针表对应的GB18030双字节字符编码字符数组;
(4)根据低字节值查找字符数组指针表里对应的GB18030双字节字符编码字符数组;
(5)返回处理结果;
该过程可逆。
在上述技术方案的基础上,采用2字节转4字节算法实现四字节区扩充A的汉字的处理;
采用4字节转4字节算法实现四字节区扩充B的汉字的处理。
在上述技术方案的基础上,当VFAT文件系统模块在读取Unicode编码或UTF编码时,首先检查编码类型,根据编码类型,来决定是否转换成四字节区扩充A和四字节区扩充B的汉字;
当VFAT文件系统模块在写字符集时,首先检查字符集是否为四字节区扩充A和四字节区扩充B,然后决定是否转换为4字节Unicode编码或4字节UTF编码。
在上述技术方案的基础上,采用2字节转4字节算法支持四字节区扩充A的汉字,其规律为,四字节,第一个字节的值从0x81到0x82,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39;
对应的Unicode编码规律为,双字节,第一个字节的值从0x34到0x4D,第二个字节的值从0x00到0xFF。
在上述技术方案的基础上,将Unicode编码转换为四字节区扩充A的汉字,包括如下步骤:
由于四字节区扩充A中的Unicode编码被双字节扩充A的52个汉字占用了,所以算法中应该将其排除在外,根据Unicode编码确定其偏移量X;
根据Unicode编码规律,则实际Unicode编码减去0x3400,为主 体偏移量Y;
两个偏移量相减,Z=Y-X,为总体偏移量;
根据四字节区扩充A的汉字规律,其码位分布如下:
四字节码位空间中第一字节相同的区域称作一级区,每个一级区有12600个码位,
四字节码位空间中第一字节和第二字节相同的区域称作二级区,每个二级区有1260个码位,
四字节码位空间中前三个字节相同的区域称作三级区,每个三级区有10个码位;
据此推算各个字节的偏移距:
m1=Z/12600
n1=Z%12600
m2=n1/1260
n2=n1%1260
m3=n2/10
n3=n2%10
根据四字节区扩充A,GB18030的基准编码为0x8139EE39,从而:
第一字节的位置是:0x81+m1+第二字节的进位;
第二字节的位置是:0x39+m2+第三字节的进位,高位进1;
第三字节的位置是:0xFE+m3+第四字节的进位,高位进1;
第四字节的位置是:0x39+n3,高位进1;
该过程可逆。
在上述技术方案的基础上,采用4字节转4字节算法支持四字节区扩充B的汉字,其规律为,四字节,第一个字节的值从0x95到0x98,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39;
对应的Unicode编码规律为,三字节,第一个字节的值为0x02, 第二个字节的值从0x00到0xA6,第三个字节的值从0x00到0xFF;
对应的UTF-16编码规律为,四字节,第一个字节的值为0XD8,第二个字节的值从0x40到0x69,第三个字节的值从0xDC到0xDE,第四个字节的值从0x00到0xFF。
在上述技术方案的基础上,将UTF-16的编码转换为Unicode值时,设U16为UTF-16编码,UNI为转换后的Unicode值,
(1)先将U16初始化为2个无符号整数W1和W2;W1为高16位,W2为低16为;
(2)将W1的低10为剥离出来组成向左偏移10位后,组成UNI的20位,将W2的低10为剥离出来组成UNI的低10位;
(3)UNI的值不会超过20位,且大于0x10FFFF,则UNI的值还需要加上0x10000。
在上述技术方案的基础上,将Unicode编码转换为四字节区扩充B的汉字,包括如下步骤:
根据Unicode编码规律,则实际Unicode编码减去0x20000,为主体偏移量Y;
根据四字节区扩充B的汉字规律,其码位分布如下:
四字节码位空间中第一字节相同的区域称作一级区,每个一级区有12600个码位,
四字节码位空间中第一字节和第二字节相同的区域称作二级区,每个二级区有1260个码位,
四字节码位空间中第一字节和第二字节相同的区域称作二级区,每个二级区有1260个码位,
据此推算各个字节的偏移距:
m1=Y/12600
n1=Y%12600
m2=n1/1260
n2=n1%1260
m3=n2/10
n3=n2%10
根据四字节区扩充B,GB18030的基准编码为0x95328236,从而:
第一字节的位置是:0x95+m1+第二字节的进位;
第二字节的位置是:0x32+m2+第三字节的进位,高位进1;
第三字节的位置是:0x82+m3+第四字节的进位,高位进1;
第四字节的位置是:0x36+n3,高位进1;
该过程可逆。
本发明所述的Linux VFAT文件系统模块支持GB18030字符集的方法,在文件系统层面实现系统能够正确识别、显示和输入GB18030-2005中文字符集编码,该方法简化和减少了为了支持GB18030-2005字符集而带来的系统开销,提供有关多字节字符和宽字节字符处理GB18030-2005中文字符集的函数实现思路,为广大Linux用户提供完美的中文字符集支持方案,让用户使用起来更加便捷。
附图说明
本发明有如下附图:
图1转换GB18030中文字符集处理流程图;
图2查表法转换GB18030中文字符集流程图;
图32字节转4字节算法转换GB18030中文字符集流程图;
图44字节转4字节算法转换GB18030中文字符集流程图。
具体实施方式
以下结合附图对本发明作进一步详细说明。
本发明所述的Linux VFAT文件系统模块支持GB18030字符集的 方法中,所述GB18030字符集指GB18030-2005字符集。GB18030-2005字符集收录了70244个汉字,其中包括GB18030-2000字符集收录的27533个汉字。GB18030-2005字符集收录的70244个汉字可参见表5。
表5GB18030-2005字符集收录的70244个汉字
本申请将GB18030-2005字符集所包含的汉字分成四个表(表1~表4):
1、双字节区,将表5所示的双字节部分的21003个汉字划分为表1,表1简称为双字节区,双字节区的汉字可对应到GBK编码、GB18030编码和Unicode编码,
2、四字节区扩充A,将表5所示的四字节部分(四字节区)的6530个汉字(CJK统一汉字扩充A,简称为四字节区扩充A)划分为表2,四字节区扩充A的汉字可对应到GB18030编码和Unicode编码,
3、四字节区扩充B,将表5所示的四字节部分(四字节区)的42711个汉字(CJK统一汉字扩充B,简称为四字节区扩充B)划分为表3,四字节区扩充B的汉字可对应到GB18030编码、Unicode编码和UTF-16编码,
4、双字节区扩充A,Unicode编码的四字节区扩充A(表2)本 来有6582个汉字,因为GB18030的双字节区(表1)已经收录过其中的52个汉字,所以本申请中四字节区扩充A对应的表2只有6530个汉字,将这52个汉字单独划分为表4,表4简称为双字节区扩充A。表4列出的这52个汉字其汉字编码是Unicode后来新增加的对应编码,需要额外单独进行转换,故将其单独列举出来。双字节区扩充A的汉字可对应到GBK编码、PUA区编码和扩充A区编码。
GBK编码是GB18030编码的一个子集,PUA区编码、扩充A区编码其实就是Unicode编码。
将表1(21003)和表2(6530)合起来就是GB18030-2000要求的27533个汉字,将表1(21003)、表2(6530)和表3(42711)合起来就是GB18030-2005要求的70244个汉字。
表1双字节区的21003汉字
序号 | 汉字 | GBK(GB18030)编码 | Unicode编码 |
1 | 一 | D2BB | 4E00 |
2 | 丁 | B6A1 | 4E01 |
3 | 丂 | 8140 | 4E02 |
4 | 七 | C6DF | 4E03 |
5 | 丄 | 8141 | 4E04 |
6 | 丅 | 8142 | 4E05 |
... | ... | ... | ... |
21001 | 﨤 | FE4C | FA24 |
21002 | 﨧 | FE4D | FA27 |
21002 | 﨨 | FE4E | FA28 |
21003 | 﨩 | FE4F | FA29 |
[0099] 表2四字节区扩充A的6530汉字
序号 | 汉字 | GB18030编码 | Unicode编码 |
1 | 8139EE39 | 3400 | |
2 | 8139EF30 | 3401 | |
3 | 8139EF31 | 3402 | |
4 | 8139EF32 | 3403 | |
5 | 8139EF33 | 3404 | |
6 | 8139EF34 | 3405 | |
... | ... | ... | ... |
6527 | 82358735 | 4DB2 | |
6528 | 82358736 | 4DB3 | |
6529 | 82358737 | 4DB4 | |
6530 | 82358738 | 4DB5 |
表3四字节区扩充B的42711汉字
序号 | 汉字 | GB18030编码 | Unicode编码 | UTF-16编码 |
1 | □ | 95328236 | 20000 | D840DC00 |
2 | □ | 95328237 | 20001 | D840DC01 |
3 | □ | 95328238 | 20002 | D840DC02 |
4 | □ | 95328239 | 20003 | D840DC03 |
5 | □ | 95328330 | 20004 | D840DC04 |
[0103]
6 | □ | 95328331 | 20005 | D840DC05 |
... | ... | ... | ... | ... |
42708 | □ | 9835F333 | 2A6D3 | D869DED3 |
42709 | □ | 9835F334 | 2A6D4 | D869DED4 |
42710 | □ | 9835F335 | 2A6D5 | D869DED5 |
42711 | □ | 9835F336 | 2A6D6 | D869DED6 |
表4双字节区扩充A的52个汉字
序号 | 汉字 | GBK编码 | PUA区编码 | 扩充A区编码 |
1 | FE55 | E81A | 3473 | |
2 | FE56 | E81B | 3447 | |
3 | FE5A | E81F | 359E | |
4 | FE5B | E820 | 361A | |
5 | FE5C | E821 | 360E | |
6 | FE5F | E824 | 396E | |
... | ... | ... | ... | ... |
49 | FE9C | E860 | 4D17 | |
50 | FE9D | E861 | 4D18 | |
51 | FE9E | E862 | 4D19 | |
52 | FE9F | E863 | 4DAE |
本发明所述的Linux VFAT文件系统模块支持GB18030字符集的方法,在Linux上面采用VFAT文件系统模块支持GB18030-2005中文 字符集编码的方法,并且提供有关多字节字符和宽字节字符处理的函数实现思路。
本发明所述的Linux VFAT文件系统模块支持GB18030字符集的方法,双字节汉字(包括双字节区的21003个汉字和双字节区扩充A的52个汉字)均采取了查表方式,四字节区扩充A的汉字与Unicode编码转换以及四字节区扩充B的汉字与UTF编码转换均采用算法实现,该方法简化和减少了为了支持GB18030字符集而带来的系统开销。
双字节汉字的处理。
1),采用查表法实现双字节区的汉字(表1)的处理;双字节区是GB18030编码和Unicode编码一一对应,可以采用比较简单的查表法实现;
2),采用查表法实现双字节区扩充A的汉字(表4)的处理;
双字节区扩充A按以下规律对应Unicode编码:双字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x40到0xFE,但不包括0x7F;对应的Unicode编码规律为:双字节,第一个字节的值从0x4E到0xFA,第二个字节的值从0x00到0xFF;
将双字节Unicode编码转换为GB18030双字节字符编码,包括如下步骤:
(1)接收双字节区或者双字节区扩充A的双字节Unicode编码;
(2)剥离其高低字节;
(3)根据高字节值查找字符数组指针表对应的GB18030双字节字符编码字符数组;
(4)根据低字节值查找字符数组指针表里对应的GB18030双字节字符编码字符数组;
(5)返回处理结果;
该过程可逆,故若将GB18030双字节字符编码转换为双字节Unicode编码,亦采用同样的原理,包括如下步骤:
(1)接收双字节区或者双字节区扩充A的GB18030双字节字符编码;
(2)剥离其高低字节;
(3)根据高字节值查找字符数组指针表对应的双字节Unicode编码字符数组;
(4)根据低字节值查找字符数组指针表里对应的Unicode编码字符编码;
(5)返回处理结果。
四字节区扩充A和四字节区扩充B的处理。
3),采用2字节转4字节算法实现四字节区扩充A的汉字(表2)的处理;
4),采用4字节转4字节算法实现四字节区扩充B的汉字(表3)的处理。
3)和4)所述的算法分别是指四字节区扩充A和四字节区扩充B里面的GB18030编码向Unicode编码转换的算法。
当VFAT文件系统模块在读取Unicode编码或UTF编码时,首先检查编码类型,根据编码类型,来决定是否转换成四字节区扩充A和四字节区扩充B的汉字;当VFAT文件系统模块在写字符集时,首先检查字符集是否为四字节区扩充A和四字节区扩充B,然后决定是否转换为4字节Unicode编码或4字节UTF编码。
采用2字节转4字节算法支持四字节区扩充A的汉字,其规律为,四字节,第一个字节的值从0x81到0x82,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39;
对应的Unicode编码规律为,双字节,第一个字节的值从0x34到0x4D,第二个字节的值从0x00到0xFF;
将Unicode编码转换为四字节区扩充A的汉字,包括如下步骤:
由于四字节区扩充A中的Unicode编码被双字节扩充A的52个 汉字占用了,所以算法中应该将其排除在外,根据Unicode编码确定其偏移量X(0到52之间);
根据Unicode编码规律,则实际Unicode编码减去0x3400,为主体偏移量Y;
两个偏移量相减,Z=Y-X,为总体偏移量;
而根据四字节区扩充A的汉字规律,其码位分布如下:
四字节码位空间中第一字节相同的区域称作一级区,每个一级区有12600个码位,即:10*126*10;
四字节码位空间中第一字节和第二字节相同的区域称作二级区,每个二级区有1260个码位,即:126*10;
四字节码位空间中前三个字节相同的区域称作三级区,每个三级区有10个码位;
从而可推算各个字节的偏移距:
m1=Z/12600
n1=Z%12600
m2=n1/1260
n2=n1%1260
m3=n2/10
n3=n2%10
根据四字节区扩充A,GB18030的基准编码为0x8139EE39,从而:
第一字节的位置是:0x81+m1+第二字节的进位;
第二字节的位置是:0x39+m2+第三字节的进位,高位进1;
第三字节的位置是:0xFE+m3+第四字节的进位,高位进1;
第四字节的位置是:0x39+n3,高位进1;
也即是:
第一字节的位置是:0x81+m1+(m2+9)/10;
第二字节的位置是:0x30+(m2+9)%10+(m3+0x10)/17;;
第三字节的位置是:0x81+(m3+0x10)%17+(n3+9)/10;
第四字节的位置是:0x30+(n3+9)%10。
该过程可逆,故若将四字节区扩充A的汉字转换为Unicode编码,亦采用同样的原理。
采用4字节转4字节算法支持四字节区扩充B的汉字,其规律为,四字节,第一个字节的值从0x95到0x98,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39;
对应的Unicode编码规律为,三字节,第一个字节的值为0x02,第二个字节的值从0x00到0xA6,第三个字节的值从0x00到0xFF;
对应的UTF-16编码规律为,四字节,第一个字节的值为0XD8,第二个字节的值从0x40到0x69,第三个字节的值从0xDC到0xDE,第四个字节的值从0x00到0xFF;如下表所示:
先考虑将UTF-16的编码转换为Unicode值,假设U16为UTF-16编码,UNI为转换后的Unicode值,
(1)先将U16初始化为2个无符号整数W1(高16位)和W2(低16为);
(2)将W1的低10为剥离出来组成向左偏移10位后,组成UNI的20位,将W2的低10为剥离出来组成UNI的低10位;
(3)UNI的值不会超过20位,且大于0x10FFFF,则UNI的值还需要加上0x10000;
这过程用数字来表示的话,如下:
U16=1101100001yyyyyy110111xxxxxxxxxx
W1=1101100001yyyyyy
W2=110111xxxxxxxxxx
UNI=0001yyyyyyxxxxxxxxxx+0x10000
=0010yyyyyyxxxxxxxxxx
=0x2####
然后再考虑将Unicode编码转换为四字节区扩充B的汉字(把Unicode值转换为GB18030编码),包括如下步骤:
由于四字节区扩充B的42711汉字和Unicode间没有断层脱节的地方,所以算法中无其他偏移量影响;
根据Unicode编码规律,则实际Unicode编码减去0x20000,为主体偏移量Y;
而根据四字节区扩充B的汉字规律,其码位分布如下:
四字节码位空间中第一字节相同的区域称作一级区,每个一级区有12600个码位,即:10*126*10;
四字节码位空间中第一字节和第二字节相同的区域称作二级区,每个二级区有1260个码位,即:126*10;
四字节码位空间中前三个字节相同的区域称作三级区,每个三级区有10个码位;
从而可推算各个字节的偏移距:
m1=Y/12600
n1=Y%12600
m2=n1/1260
n2=n1%1260
m3=n2/10
n3=n2%10
根据四字节区扩充B,GB18030的基准编码为0x95328236,从而:
第一字节的位置是:0x95+m1+第二字节的进位;
第二字节的位置是:0x32+m2+第三字节的进位,高位进1;
第三字节的位置是:0x82+m3+第四字节的进位,高位进1;
第四字节的位置是:0x36+n3,高位进1;
也即是:
第一字节的位置是:0x95+m1+(m2+9)/10;
第二字节的位置是:0x30+(m2+9)%10+(m3+0x10)/17;;
第三字节的位置是:0x82+(m3+0x10)%17+(n3+9)/10;
第四字节的位置是:0x30+(n3+9)%10。
该过程可逆,故若将四字节区扩充B的汉字转换为UTF-16编码,亦采用同样的原理。
以下具体实例以小端体系结构为准。(在计算机体系结构中,根据字节数据存储的位序关系,可以分为大端体系结构和小端体系结构。所谓的大端体系结构,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端体系结构则正好相反。)
如图1所示为转换GB18030中文字符集处理流程图。步骤如下:
步骤101,Linux VFAT文件系统模块做好接收Unicode编码的准备;
步骤102,Linux VFAT文件系统模块开始接收Unicode编码;
步骤103,根据接收的Unicode编码,查找字符数组指针表对应的双字节Unicode编码字符数组,判断是否为双字节区所示的双字节区的21003汉字;
如果找到,则转到步骤105,采用查表法转换为GB18030编码;如果没有找到,则转到步骤104,继续判断是否为双字节区Unicode编码;
步骤104,根据接收的Unicode编码,查找字符数组指针表对应的双字节区扩充A的52个汉字Unicode编码字符数组,接着判断接收的Unicode编码判断是否为双字节区扩充A的52个汉字,如果找 到,则转到步骤105,采用查表法转换为GB18030编码;如果没有找到,则转到步骤106,判断是否为四字节区扩充A的Unicode编码;
步骤105,采用查表法转换为GB18030编码,然后转到步骤110,返回处理结果;
步骤106,根据接收的Unicode编码,查找字符数组指针表对应的四字节区扩充A的Unicode编码字符数组,接着判断接收的Unicode编码是否为四字节区扩充A的6530汉字,如果找到,则转到步骤107,采用2字节转4字节算法转换GB18030中文字符集;如果没有找到,则转到步骤108,接着判断是否为UTF-16编码;
步骤107,采用2字节转4字节算法转换GB18030中文字符集,然后转到步骤110,返回处理结果;
步骤108,根据接收的Unicode编码,查找字符数组指针表对应的四字节区扩充B的Unicode编码字符数组,接着判断接收的Unicode编码是否为UTF-16编码,且为四字节区扩充B四字节区扩充B的42711汉字,如果找到,则转到步骤109,采用4字节转4字节算法转换GB18030中文字符集;如果没有找到,则转到步骤110,返回处理结果;
步骤109,采用4字节转4字节算法转换GB18030中文字符集,然后转到步骤110,返回处理结果;
步骤110,返回处理结果。
进一步阐述图1提及的查表法,如图2所示为查表法转换GB18030中文字符集流程图。步骤如下:
1)做好接收Unicode编码的准备,如步骤201,并开始接收双字节区或者双字节区扩充AUnicode编码,如步骤202;
2)剥离该Unicode编码的高低字节,如步骤203;
3)根据剥离的Unicode编码的高位字节数值,查找字符数组指针表,定位对应的字符数组,如步骤204;
4)如果没有找到,则报错,进入异常处理,如步骤205;
5)如果找到,则根据步骤203剥离的低字节数值查找字符数组表内对应的GB18030编码,如步骤206;
6)如果没有找到,则报错,进入异常处理,如步骤207;
7)如果找到,则将对应的GB18030编码值赋予转换指针,如步骤208;
返回处理结果,如步骤209。
进一步阐述图1提及的2字节转4字节算法,如图3所示为2字节转4字节算法转换GB18030中文字符集流程图。步骤如下:
1)做好接收Unicode编码的准备,如步骤301,并开始接收四字节区扩充A的Unicode编码,如步骤302;
2)剥离该Unicode编码的高低字节,如步骤303;
3)根据剥离的Unicode编码的高位和低位字节数值,确认是否为四字节区扩充A的Unicode编码,如步骤304;
4)如果不是,则报错,进入异常处理,如步骤305;
5)如果是,则确定该Unicode编码与四字节区扩充A的基准Unicode编码0x3400的偏移量Y,如步骤306;
6)确定Unicode编码与双字节区扩充A占用的52个Unicode编码的偏移量X,如步骤307;计算出总偏移量Z=Y-X,如步骤308;
7)根据总偏移量推算转换后GB18030编码4个字节各个字节的偏移量,如步骤309;
8)根据与四字节区扩充A基准GB18030编码第4字节0x39比较,判断第4字节是否进位,如步骤310;如果不需要进位,则直接给转换后的第4字节赋值,如步骤311;如果需要进位,则在赋值的同时,给第3字节的偏移量加上1,如步骤312;
9)根据与四字节区扩充A基准GB18030编码第3字节0xEE比较,判断第3字节是否进位,如步骤313;如果不需要进位,则直接给转换后的第3字节赋值,如步骤314;如果需要进位,则在赋值的同时,给第2字节的偏移量加上1,如步骤315;
10)根据与四字节区扩充A基准GB18030编码第4字节0x39比较,判断第2字节是否进位,如步骤316;如果不需要进位,则直接给转换后的第2字节赋值,如步骤317;如果需要进位,则在赋值的同时,给第1字节的偏移量加上1,如步骤318;
11)在四字节区扩充A基准GB18030编码第1字节0x91的基础上,直接给转换后的第1字节赋值,如步骤319;
返回处理结果,如步骤320。
进一步阐述图1提及的4字节转4字节算法,如图4所示为4字节转4字节算法转换GB18030中文字符集流程图。步骤如下:
1)做好接收Unicode编码的准备,如步骤401,并开始接收四字节区扩充B的UTF-16编码,如步骤402;
2)剥离该UTF-16编码的4个字节,如步骤403;
3)根据剥离的Unicode编码的4个字节数值,确认是否为四字节区扩充B的UTF-16编码,如步骤404;如果不是,则报错,进入异常处理,如步骤405;
4)根据剥离的Unicode编码的4个字节数值,确认是否为四字节区扩充B的UTF-16编码,如步骤404;如果不是,则报错,进入异常处理,如步骤405;
5)如果是,则根据剥离的4个字节数值,转换为Unicode值,如步骤406;
6)根据转换后的Unicode值与四字节区扩充B的基准Unicode编码0x20000对比,计算总偏移量,如步骤407;并推算各个GB18030编码的偏移量,如步骤408;
7)根据与四字节区扩充B基准GB18030编码第4字节0x36比较,判断第4字节是否进位,如步骤409;如果不需要进位,则直接给转换后的第4字节赋值,如步骤410;如果需要进位,则在赋值的同时,给第3字节的偏移量加上1,如步骤411;
8)根据与四字节区扩充B基准GB18030编码第3字节0x82比 较,判断第3字节是否进位,如步骤412;如果不需要进位,则直接给转换后的第3字节赋值,如步骤413;如果需要进位,则在赋值的同时,给第2字节的偏移量加上1,如步骤414;
9)根据与四字节区扩充B基准GB18030编码第4字节0x32比较,判断第2字节是否进位,如步骤415;如果不需要进位,则直接给转换后的第2字节赋值,如步骤416;如果需要进位,则在赋值的同时,给第1字节的偏移量加上1,如步骤417;
10)在四字节区扩充B基准GB18030编码第1字节0x95的基础上,直接给转换后的第1字节赋值,如步骤418;
返回处理结果,如步骤419。
本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。
Claims (10)
1.一种Linux VFAT文件系统模块支持GB18030字符集的方法,所述GB18030字符集指GB18030-2005字符集,GB18030字符集包括双字节部分和四字节部分,其特征在于:将字符集划分为:
双字节区,字符集中双字节部分的21003个汉字,对应到GBK编码、GB18030编码和Unicode编码;
四字节区扩充A,字符集中四字节部分的CJK统一汉字扩充A的6530个汉字,对应到GB18030编码和Unicode编码;
四字节区扩充B,字符集中四字节部分的CJK统一汉字扩充B的42711个汉字,对应到GB18030编码、Unicode编码和UTF-16编码;
双字节区扩充A,字符集中四字节区扩充A和双字节区中共有的52个汉字,对应到GBK编码、PUA区编码和扩充A区编码。
双字节汉字均采取了查表方式,四字节区扩充A的汉字与Unicode编码转换以及四字节区扩充B的汉字与UTF编码转换均采用算法实现。
双字节汉字包括双字节区的21003个汉字和双字节区扩充A的52个汉字。
2.如权利要求1所述的Linux VFAT文件系统模块支持GB18030字符集的方法,其特征在于:当采用查表法支持双字节汉字时,双字节区是GB18030编码和Unicode编码一一对应;双字节区扩充A按以下规律对应Unicode编码:双字节,第一个字节的值从0x81到0xFE,第二个字节的值从0x40到0xFE,但不包括0x7F;对应的Unicode编码规律为:双字节,第一个字节的值从0x4E到0xFA,第二个字节的值从0x00到0xFF。
3.如权利要求2所述的Linux VFAT文件系统模块支持GB18030字符集的方法,其特征在于:将双字节Unicode编码转换为GB18030双字节字符编码,包括如下步骤:
(1)接收双字节区或者双字节区扩充A的双字节Unicode编码;
(2)剥离其高低字节;
(3)根据高字节值查找字符数组指针表对应的GB18030双字节字符编码字符数组;
(4)根据低字节值查找字符数组指针表里对应的GB18030双字节字符编码字符数组;
(5)返回处理结果;
该过程可逆。
4.如权利要求1所述的Linux VFAT文件系统模块支持GB18030字符集的方法,其特征在于:采用2字节转4字节算法实现四字节区扩充A的汉字的处理;
采用4字节转4字节算法实现四字节区扩充B的汉字的处理。
5.如权利要求4所述的Linux VFAT文件系统模块支持GB18030字符集的方法,其特征在于:当VFAT文件系统模块在读取Unicode编码或UTF编码时,首先检查编码类型,根据编码类型,来决定是否转换成四字节区扩充A和四字节区扩充B的汉字;
当VFAT文件系统模块在写字符集时,首先检查字符集是否为四字节区扩充A和四字节区扩充B,然后决定是否转换为4字节Unicode编码或4字节UTF编码。
6.如权利要求4所述的Linux VFAT文件系统模块支持GB18030字符集的方法,其特征在于:采用2字节转4字节算法支持四字节区扩充A的汉字,其规律为,四字节,第一个字节的值从0x81到0x82,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39;
对应的Unicode编码规律为,双字节,第一个字节的值从0x34到0x4D,第二个字节的值从0x00到0xFF。
7.如权利要求6所述的Linux VFAT文件系统模块支持GB18030字符集的方法,其特征在于:将Unicode编码转换为四字节区扩充A的汉字,包括如下步骤:
由于四字节区扩充A中的Unicode编码被双字节扩充A的52个汉字占用了,所以算法中应该将其排除在外,根据Unicode编码确定其偏移量X;
根据Unicode编码规律,则实际Unicode编码减去0x3400,为主体偏移量Y;
两个偏移量相减,Z=Y-X,为总体偏移量;
根据四字节区扩充A的汉字规律,其码位分布如下:
四字节码位空间中第一字节相同的区域称作一级区,每个一级区有12600个码位,
四字节码位空间中第一字节和第二字节相同的区域称作二级区,每个二级区有1260个码位,
四字节码位空间中前三个字节相同的区域称作三级区,每个三级区有10个码位;
据此推算各个字节的偏移距:
m1=Z/12600
n1=Z%12600
m2=n1/1260
n2=n1%1260
m3=n2/10
n3=n2%10
根据四字节区扩充A,GB18030的基准编码为0x8139EE39,从而:
第一字节的位置是:0x81+m1+第二字节的进位;
第二字节的位置是:0x39+m2+第三字节的进位,高位进1;
第三字节的位置是:0xFE+m3+第四字节的进位,高位进1;
第四字节的位置是:0x39+n3,高位进1;
该过程可逆。
8.如权利要求4所述的Linux VFAT文件系统模块支持GB18030字符集的方法,其特征在于:采用4字节转4字节算法支持四字节区扩充B的汉字,其规律为,四字节,第一个字节的值从0x95到0x98,第二个字节的值从0x30到0x39,第三个字节从0x81到0xFE,第四个字节从0x30到0x39;
对应的Unicode编码规律为,三字节,第一个字节的值为0x02,第二个字节的值从0x00到0xA6,第三个字节的值从0x00到0xFF;
对应的UTF-16编码规律为,四字节,第一个字节的值为0XD8,第二个字节的值从0x40到0x69,第三个字节的值从0xDC到0xDE,第四个字节的值从0x00到0xFF。
9.如权利要求8所述的Linux VFAT文件系统模块支持GB18030字符集的方法,其特征在于:将UTF-16的编码转换为Unicode值时,设U16为UTF-16编码,UNI为转换后的Unicode值,
(1)先将U16初始化为2个无符号整数W1和W2;W1为高16位,W2为低16为;
(2)将W1的低10为剥离出来组成向左偏移10位后,组成UNI的20位,将W2的低10为剥离出来组成UNI的低10位;
(3)UNI的值不会超过20位,且大于0x10FFFF,则UNI的值还需要加上0x10000。
10.如权利要求8所述的Linux VFAT文件系统模块支持GB18030字符集的方法,其特征在于:将Unicode编码转换为四字节区扩充B的汉字,包括如下步骤:
根据Unicode编码规律,则实际Unicode编码减去0x20000,为主体偏移量Y;
根据四字节区扩充B的汉字规律,其码位分布如下:
四字节码位空间中第一字节相同的区域称作一级区,每个一级区有12600个码位,
四字节码位空间中第一字节和第二字节相同的区域称作二级区,每个二级区有1260个码位,
四字节码位空间中第一字节和第二字节相同的区域称作二级区,每个二级区有1260个码位,
据此推算各个字节的偏移距:
m1=Y/12600
n1=Y%12600
m2=n1/1260
n2=n1%1260
m3=n2/10
n3=n2%10
根据四字节区扩充B,GB18030的基准编码为0x95328236,从而:
第一字节的位置是:0x95+m1+第二字节的进位;
第二字节的位置是:0x32+m2+第三字节的进位,高位进1;
第三字节的位置是:0x82+m3+第四字节的进位,高位进1;
第四字节的位置是:0x36+n3,高位进1;
该过程可逆。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310364438.3A CN103399843B (zh) | 2013-08-20 | 2013-08-20 | 一种Linux VFAT文件系统模块支持GB18030字符集的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310364438.3A CN103399843B (zh) | 2013-08-20 | 2013-08-20 | 一种Linux VFAT文件系统模块支持GB18030字符集的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103399843A true CN103399843A (zh) | 2013-11-20 |
CN103399843B CN103399843B (zh) | 2016-12-28 |
Family
ID=49563474
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310364438.3A Active CN103399843B (zh) | 2013-08-20 | 2013-08-20 | 一种Linux VFAT文件系统模块支持GB18030字符集的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103399843B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104750695A (zh) * | 2013-12-26 | 2015-07-01 | 深圳富泰宏精密工业有限公司 | 智能字库文件转码系统及方法 |
CN108287811A (zh) * | 2017-01-10 | 2018-07-17 | 阿里巴巴集团控股有限公司 | 一种字符校验方法及装置 |
CN111428441A (zh) * | 2020-03-18 | 2020-07-17 | 中国电子科技集团公司第二十八研究所 | 面向信息系统跨平台应用的汉字编码转换方法及设备 |
CN111444680A (zh) * | 2020-04-25 | 2020-07-24 | 中信银行股份有限公司 | 生僻字的编码扩展方法、装置、存储介质及电子设备 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102243623A (zh) * | 2010-11-02 | 2011-11-16 | 泗阳天琴软件科技有限公司 | 一种汉字编码的方法 |
CN102339216A (zh) * | 2010-07-15 | 2012-02-01 | 江苏国光信息产业股份有限公司 | 基于VxWorks操作系统的汉字显示方法 |
CN102801429A (zh) * | 2012-08-16 | 2012-11-28 | 福州大学 | 适用于gb18030的url中文参数压缩算法 |
-
2013
- 2013-08-20 CN CN201310364438.3A patent/CN103399843B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102339216A (zh) * | 2010-07-15 | 2012-02-01 | 江苏国光信息产业股份有限公司 | 基于VxWorks操作系统的汉字显示方法 |
CN102243623A (zh) * | 2010-11-02 | 2011-11-16 | 泗阳天琴软件科技有限公司 | 一种汉字编码的方法 |
CN102801429A (zh) * | 2012-08-16 | 2012-11-28 | 福州大学 | 适用于gb18030的url中文参数压缩算法 |
Non-Patent Citations (2)
Title |
---|
中华人民共和国国家质量监督检疫总局 中国国家标准化管理委员会: "信息技术 中文编码字符集", 《中华人民共和国国家标准》 * |
夏春蕾 等: "GB18030汉字信息的二维条码拆分迭代编码算法", 《计算机应用》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104750695A (zh) * | 2013-12-26 | 2015-07-01 | 深圳富泰宏精密工业有限公司 | 智能字库文件转码系统及方法 |
CN108287811A (zh) * | 2017-01-10 | 2018-07-17 | 阿里巴巴集团控股有限公司 | 一种字符校验方法及装置 |
CN108287811B (zh) * | 2017-01-10 | 2021-08-17 | 阿里巴巴集团控股有限公司 | 一种字符校验方法及装置 |
CN111428441A (zh) * | 2020-03-18 | 2020-07-17 | 中国电子科技集团公司第二十八研究所 | 面向信息系统跨平台应用的汉字编码转换方法及设备 |
CN111428441B (zh) * | 2020-03-18 | 2024-01-19 | 中国电子科技集团公司第二十八研究所 | 面向信息系统跨平台应用的汉字编码转换方法及设备 |
CN111444680A (zh) * | 2020-04-25 | 2020-07-24 | 中信银行股份有限公司 | 生僻字的编码扩展方法、装置、存储介质及电子设备 |
CN111444680B (zh) * | 2020-04-25 | 2023-05-16 | 中信银行股份有限公司 | 生僻字的编码扩展方法、装置、存储介质及电子设备 |
Also Published As
Publication number | Publication date |
---|---|
CN103399843B (zh) | 2016-12-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103399843A (zh) | 一种Linux VFAT文件系统模块支持GB18030字符集的方法 | |
CN102592160B (zh) | 一种面向短信的字符二维码编码方法和解码方法 | |
CN103246857B (zh) | 一种使用形式化解码规则解析异构编码获得物品信息的方法 | |
CN103914544A (zh) | 一种基于地址特征词的多层次快速中文地址匹配方法 | |
CN105868171A (zh) | 一种Excel文件的校验方法及装置 | |
CN101452441A (zh) | 一种电子表格通用数据解析导入方法 | |
CN104361025B (zh) | 一种多源空间数据融合与集成的方法 | |
CN103425611B (zh) | 用于计量领域的串口通讯方法 | |
CN103150380A (zh) | 一种可定制表格式的Excel表解析方法 | |
CN104881469A (zh) | 一种数据导出方法和装置 | |
CN105069056A (zh) | 基于字符串匹配的身份证住址信息解析方法及系统 | |
CN110147330B (zh) | 一种字模数据的缓存方法、装置、设备和存储介质 | |
CN105278961A (zh) | 生成数据库表结构文档的方法及系统 | |
CN111428441B (zh) | 面向信息系统跨平台应用的汉字编码转换方法及设备 | |
CN103810171A (zh) | 生成限定范围的随机测试数据的方法及系统 | |
CN106227575A (zh) | 一种生成与解析文本文件的方法 | |
CN102339216A (zh) | 基于VxWorks操作系统的汉字显示方法 | |
CN102799410A (zh) | 基于李氏制约竞争计数编码的异步fifo地址转换电路 | |
CN105279123A (zh) | 双冗余1553b总线的串口转换结构及转换方法 | |
CN101369953B (zh) | 一种字库的网络分发方法及系统 | |
CN102768655A (zh) | 基于java的蒙古文显示方法 | |
CN105653506A (zh) | 一种基于字符编码转换的gpu内文本处理的方法及装置 | |
CN103995602A (zh) | 证件多语种信息录入和纠错系统 | |
CN103927384A (zh) | 利用html脚本解析的异构系统间多层级数据同步方法及系统 | |
CN110134684B (zh) | 一种bim模型数据的数据库存储方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |