首页 / 知识
用Python实现GB与BIG5码的转换
2023-11-12 13:30:00
GB码与BIG5是中国人常用的两种编码集。GB码为大陆使用,BIG5为香港与台湾使用。每个编码都由2个字符构成,高字节在前,低字节在后。下面我将使用Python实现的编码转换的程序向大家作一个介绍。关于编码的一些知识大家可以去网上查找,本人不再赘述。
GB码是大陆使用的编码集。以前使用的为GB-2312编程,它只有常用字,字数有限。后国家制定了新的GBK编码,汉字已经达到了2万多。GBK完全兼容原GB-2312编码,也就是说一个GB2312的编码在GBK上是一模一样的。这里所介绍的转换是以GBK为基础的,因此适用性很广。GBK编码中不仅包括了原GB-2312编码,同时也包括了许多简码的繁体码,同时还有许多的符号与不常用汉字。GBK编码的范围是:高字节从0x81到0xFE,低字节从0x40到0xFE,同时不包括0x7F。这样如果我们将其排成一个矩形,看上去就少了xx7F一根线。
编码的定位
那么如何定位一个GBK码呢?当我们拿到一个编码时,如何判断是不是一个GBK码,如果是GBK码如何定位它的位置呢?
判断一个GBK码应该比较简单,我们只要根据它的有效范围进行判定即可。如:
if0x81<=ch1<=0xFEand(0x40<=ch2<=0x7Eor0x7E<=ch2<=0xFE):#isgbchar
这里ch1和ch2分别是一个字符的高字节和低字节。
如何定位(为什么要定位我们在后面讲)?首先介绍一下码表。码表是所有编码放在一起形成的,你可以将其放在文件中(这里讲述的是将编码放在文件中)。我们在存放编码时是将有实际意义的编码放在了一起(因为有一些组合是不存在的),而且是按字节大小的顺序放的。
根据GBK的编码范围,我们可以设想一个二维坐标,纵坐标是高字节,横坐标是低字节,每一个交叉点上是一个汉字,占两个字节。这样一行上的汉字个数应该为0xFE-0x40+1-1=190(加1是因为要把0x40也算进去。减1是因为要把7F去掉)。定位时,我们先用高字节减去0x81,得到纵坐标偏移量。用低字节减去0x40得到横坐标偏移量。用纵坐标偏移量乘以每个汉字个数,加上横坐标偏移量就得到汉字的偏移量。再乘以2得到字节的偏移量。那么定位算法为:
index=((ch1-0x81)*190+(ch2-0x40)-(ch2/128))*2
上面的算法中有-(ch2/128)。这是因为GBK中没有7F码,因此当ch2小于7F时,ch2/128=0,则表示7F没有计算在内。而当ch2大于7F时,ch2/128=1,则表示多算了7F一值,因此要去掉。由于一个汉字有两个字节,故要乘以2。这样我们就得到一个GBK汉字在码表中的字节位置了。
BIG5是香港和台湾地区使用的编码集。它的范围为:高字节从0xA0到0xFE,低字节从0x40到0x7E,和0xA1到0xFE两部分。判断一个汉字是否是BIG5编码,可以如上对字符的编码范围判断即可。如何定位呢?那么也想象所有编码排列为一个二维坐标,纵坐标是高字节,横坐标是低字节。这样一行上的汉字个数:(0x7E-0x40+1)+(0xFE-0xA1+1)=157。那么定位算法分两块,为:
if0x40<=ch2<=0x7E:#isbig5char
index=((ch1-0xA1)*157+(ch2-0x40))*2
elif0xA1<=ch2<=0xFE:#isbig5char
index=((ch1-0xA1)*157+(ch2-0xA1+63))*2
对于第二块,计算偏移量时因为有两块数值,所以在计算后面一段值时,不要忘了前面还有一段值。0x7E-0x40+1=63。
编码转换
上面,我们已经可以得到GBK汉字和BIG5的字节位置。那么就可以开始进行转换了。对于转换我原以为有一个特别的算法,能够按照两种编码的不同,简单地通过计算就可以得出结果来,其实是不存在这种算法的。真正的做法是通过建立转换码表文件实现的。即对于GBK码表,将原位置上的GBK汉字改成相应的BIG5汉字。对于BIG5码表,将原位置上的BIG5汉字改成相应的GBK汉字。
这样,由于原来汉字的位置没有变,但编码已经变成了想要转换的编码。通过计算出原汉字的位置,将转换码表中对应汉字位置的字符取出来,这样就完成了转换(这就是为什么要进行编码定位的原因)。的确,程序是简单的,但真正细致的工作是在建立转换码表上。我们需要从GBK转BIG5的码表文件,和BIG5转GBK的码表文件。好在这一工作已经有人完成了,在网上可以找到这种信息。本人就是在网上找到了这种对应的转换码表,于是完成了一个用Python做的编码转换程序。(想要此程序的可以点击此处下载pygb2big.zip)
一个用于编码转换的Python模块的使用介绍程序文件名为pygb2big.py。命令行:
pythonpygb2big.py[-u][-b-g]inputfileoutputfile。
它主要的命令行参数为:-b,表示将GBK转化为BIG5;-g,表示将BIG5转成GBK;-u,显示程序的用法。inputfile为输入的待处理的文件;而ouputfile为结果文件。它带有三个转换码表文件,其中gbk2big.txt为GBK转big5对照表;big2gbk.txt为BIG转GBKcf对照表。另一个为big2gbk-f.txt,只是提供但并未使用,它是将BIG5转换为繁体GBK码。
有了这个转换模块,我们就可以应用于任何需要进行码制转换的地方了。当然,这里只是GBK到BIG5的转换,如果有其它的转换码表文件,我们也可以实现其它的转换功能。
以上内容为大家介绍了用Python实现GB与BIG5码的转换,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注我们http://www.mobiletrain.org/
最新内容
相关内容
For循环如何在Python中工作
For循环如何在Python中工作,工作,项目,代码,培训,流程,示例,序列,语句,语法,实际,Python的for循环通过遍历数组的序列来工作。从本质上讲,它在学习Python可以做这些工作
学习Python可以做这些工作,网络,数据,工作,网站,技术,培训,行业,发展,人工智能,分析,Python语言非常受欢迎,随着互联网的快速发展,很多不是计算Python爬虫学到什么程度可以找工作
Python爬虫学到什么程度可以找工作,技术,项目,网站,网上,下来,系统,公司,数据,占比,工具,有同学在群里和大家讨论,问的最多的问题就是,python爬python字节码和机器码的区别
python字节码和机器码的区别,数据,代码,地址,数字,电脑,状态,字节,机器码,亚洲,培训,机器码,学名机器语言指令,有时也被称为原生码,是电脑的CPUpython 字节码指令
python 字节码指令,代码,数据,信息,工具,标准,培训,字节,指令,文件,对象,为什么pyc文件也称作字节码文件?因为这些文件存储的都是一些二进制python如何读取列表中元素的位置?
python如何读取列表中元素的位置?,位置,数据,异常,培训,字符串,元素,索引,方法,示例,结果,python读取列表中元素位置的方法:1、使用index()方怎么查看python模块在什么位置
怎么查看python模块在什么位置,位置,代码,培训,模块,路径,下面,以上,文件,方法,更多,查看python模块在什么位置的方法:若要获取模块的文件名为Python中int占几个字节
Python中int占几个字节,系统,低位,培训,数字,字节,数组,元素,结构,表示,类型,以python3版本为例说明,int类型在python中是动态长度的。因为pytpython岗位主要做什么工作?
python岗位主要做什么工作?,标准,管理,工作,系统,机器人,数据,服务,代码,通信,培训,python的工作岗位还是很多的,涉及的工作方向也很广,下面举怎么找到苹果电脑 python安装位置
怎么找到苹果电脑 python安装位置,系统,位置,培训,版本,苹果电脑,终端,路径,命令,里面,以上,Mac系统自带python路径为:/System/Library/Framepython 培训之 object是什么类型
python 培训之 object是什么类型,培训,类型,实例,顶端,对象,关系,链条,父子,数据类型,属性,在Python的世界中,object是父子关系的顶端,所有的数python注释一般放在什么位置
python注释一般放在什么位置,代码,位置,培训,注释,时间,引号,可能会,不可或缺,变量,语句,python写代码注释是一件很重要的事情,如果你写的一段