- 浏览: 40439 次
- 性别:
- 来自: 北京
最新评论
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码应该比较简单,我们只要根据它的有效范围进行判定即可。如:
if 0x81&=ch1&=0xFE and (0x40&=ch2&=0x7E or 0x7E&=ch2&=0xFE): #is gb char
这里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。那么定位算法分两块,为:
if 0x40&=ch2&=0x7E: #is big5 char
index=((ch1-0xA1)*157+(ch2-0x40))*2
elif 0xA1&=ch2&=0xFE: #is big5 char
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做的编码转换程序。(想要此程序的可以去作者主页http://pyrecord.126.com上查找)
一个用于编码转换的Python模块的使用介绍
程序文件名为pygb2big.py。命令行:
python pygb2big.py [-u] [-b|-g] inputfile outputfile。
它主要的命令行参数为:-b,表示将GBK转化为BIG5;-g,表示将BIG5转成GBK;-u,显示程序的用法。inputfile为输入的待处理的文件;而ouputfile为结果文件。它带有三个转换码表文件,其中gbk2big.txt为GBK转big5对照表;big2gbk.txt为BIG转GBKcf对照表。另一个为big2gbk-f.txt,只是提供但并未使用,它是将BIG5转换为繁体GBK码。
有了这个转换模块,我们就可以应用于任何需要进行码制转换的地方了。当然,这里只是GBK到BIG5的转换,如果有其它的转换码表文件,我们也可以实现其它的转换功能。
编码的定位
那么如何定位一个GBK码呢?当我们拿到一个编码时,如何判断是不是一个GBK码,如果是GBK码如何定位它的位置呢?
判断一个GBK码应该比较简单,我们只要根据它的有效范围进行判定即可。如:
if 0x81&=ch1&=0xFE and (0x40&=ch2&=0x7E or 0x7E&=ch2&=0xFE): #is gb char
这里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。那么定位算法分两块,为:
if 0x40&=ch2&=0x7E: #is big5 char
index=((ch1-0xA1)*157+(ch2-0x40))*2
elif 0xA1&=ch2&=0xFE: #is big5 char
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做的编码转换程序。(想要此程序的可以去作者主页http://pyrecord.126.com上查找)
一个用于编码转换的Python模块的使用介绍
程序文件名为pygb2big.py。命令行:
python pygb2big.py [-u] [-b|-g] inputfile outputfile。
它主要的命令行参数为:-b,表示将GBK转化为BIG5;-g,表示将BIG5转成GBK;-u,显示程序的用法。inputfile为输入的待处理的文件;而ouputfile为结果文件。它带有三个转换码表文件,其中gbk2big.txt为GBK转big5对照表;big2gbk.txt为BIG转GBKcf对照表。另一个为big2gbk-f.txt,只是提供但并未使用,它是将BIG5转换为繁体GBK码。
有了这个转换模块,我们就可以应用于任何需要进行码制转换的地方了。当然,这里只是GBK到BIG5的转换,如果有其它的转换码表文件,我们也可以实现其它的转换功能。
发表评论
文章已被作者锁定,不允许评论。
-
JVM调优的陷阱
2011-10-24 13:01 1981开这帖的目的是想让大家了解到,所谓“标准参数”是件很微妙的事情 ... -
高效的Java异常处理框架
2009-06-23 10:58 1364一、 异常的概念和Java异常体系结构 异常是程序 ... -
六种异常处理的陋习
2009-06-23 10:23 773你觉得自己是一个Java专 ... -
HTML Response ContentType 大全
2009-06-18 13:19 977".*"="applicatio ... -
Oracle入门基本知识一点通
2009-02-11 16:00 1036引自http://www.oraclebbs.com/ ... -
javaFx环境变量配置
2009-02-09 11:01 39991)安装javafx_sdk-1_0_1-windows-i5 ... -
部署Log4j
2009-02-04 17:20 8481、拷贝"log4j-1.2.7.jar" ... -
eclipse debug 入门
2009-02-04 17:20 19901.Step Into (also F5) 跳入 2.Step ... -
AbstractWizardFormController 实例
2009-02-04 17:19 2035由于工作需要,需要经多个表单在最后一部进行操作,觉得sprin ... -
学习笔记:DB2 9 管理 - 2
2009-02-04 17:18 947DB2 9 管理 第 1 部分:服务器管理 二、DB2 客 ... -
学习笔记:DB2 9 管理 - 1
2009-02-04 17:17 680DB2 9 管理 第 1 部分:服务器管理 一、DB2 实 ... -
面向对象程序设计的61条原则收藏
2009-02-04 17:16 713(1)所有数据都应该隐藏在所在的类的内部。 (2)类的使 ... -
POI读写Excel文件
2009-02-04 17:15 1649约定:POI项目2.0版现在已经接近正式发行阶段,开发进度迅速 ... -
J2EE程序中的SQL语句自动构造方法收藏
2009-02-04 17:12 689INSERT、DELETE、UPDATE 三种SQL语句是数据 ... -
oracle9i存储过程、触发器、函数简单实例(基于PL/SQL7.1)收藏
2009-02-04 17:11 2052第一:已经存在表PUB_T_DIVISION_TEST,可以使 ... -
oracle 函数大全收藏
2009-02-04 17:11 951常用oracle函数 SQL中的单记录函数 1.ASCII ... -
PLSQL循序渐进全面学习教程(全)收藏
2009-02-04 17:08 2129康师傅 2008年01月24日( ... -
oracle系统命令收藏
2009-02-04 17:06 8980 查看表的结构其中的一种做法: select COL ... -
oracle的SQLPLUS命令大全收藏
2009-02-04 17:04 1679Oracle的sql*plus是与oracle ...
相关推荐
因此,学习并熟练掌握字符集知识,特别是如何在不同字符集之间进行转换,是每个IT专业人员必备的技能之一。如果这个压缩包提供了相关的源码和工具,它将是一个宝贵的教育资源,帮助开发者加深对字符集原理的理解,并...
5. **GBK编码**:GBK是中国大陆广泛使用的字符集,包含了大量的中文字符,确保了中文环境下的兼容性和可读性。 6. **源码可定制**:拥有源码意味着用户可以根据自身需求对模板进行二次开发,添加自定义功能,调整...
GBK是中文字符集编码的一种,用于处理中文字符,确保在非UTF-8环境下正确显示中文内容。 在火红商城ecshop模版gbk2.7中,我们可以看到以下几个主要的知识点: 1. **ECSHOP系统**:ECSHOP是一款基于PHP和MySQL...
考虑到GBK编码,系统在处理中文字符时会特别关注字符集的正确设置,确保中文内容的正常显示。 二、功能模块 1. 内容管理:系统应包含一个强大的内容管理系统,允许管理员上传、编辑和管理小说章节。此外,还应支持...
6. 显示优化:GBK编码表明此系统可能主要面向中文用户,因此需要处理中文字符集问题,确保页面在不同浏览器中正确显示。此外,前端界面设计也是关键,包括HTML、CSS和JavaScript的使用,提升用户体验。 7. 安全性:...
同时,考虑到GBK编码,可能需要关注多语言支持和字符集兼容性问题,尤其是在处理中文内容时。另外,安全性是任何在线平台的重要考虑因素,因此理解和掌握如何维护和升级系统以应对安全威胁也至关重要。 总的来说,...
这个系统是针对简体中文用户设计的,并且编码方式采用了GBK,这是中文字符集的一种常见标准,尤其在中国大陆广泛使用。源码以ZIP压缩格式提供,意味着用户可以下载并解压后进行查看和修改。 【PHP基础知识】 PHP...
9. **GB2312国标字符集**:GB2312包含三部分,但未提及具体构成。 10. **汉字编码**:GB2312、GBK、GB18030的部分常用汉字内码相同。 **单项选择题知识点**: 1. **计算机作用**:计算机没有创造新的物质资源,...
GBK是中国大陆广泛使用的汉字编码标准,它包含了大量的汉字字符,确保了模板在处理中文内容时的兼容性。DZ2.5版本是Discuz! 的早期版本,虽然现在已经有了更新的版本,但仍有部分用户出于稳定性和习惯选择使用。 每...
这里的`useUnicode`和`characterEncoding`参数分别用于设定字符集和编码方式。 3. **创建数据库连接**: 要建立数据库连接,需调用`DriverManager.getConnection(String url, String username, String password)`...
- 字符“好”的内码用二进制表示可能是"1101101111000011",这取决于所使用的字符集(如GBK或UTF-8)。 - "H"与"e"的内码差值在ASCII码中是17,但在其他字符集中可能不同。 5. **数据库管理**: - Access数据表...
- **UNI2GB.c**:可能处理Unicode到GBK的转换,用于支持多语言字符集。 - **SITable.c**:可能涉及服务信息表(Service Information Table, SIT),这是DVB系统中描述可用频道和服务的表格。 - **dvbepg.c**:...