一、汉字编码的种类

1、GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范,当然也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个汉字。

GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。

GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。

2、Big5又称大五码,主要为香港与台湾使用,即是一个繁体字编码。每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE(即129-255),共126种。第二个字节的范围不连续,分别为0X40-0X7E(即64-126),0XA1-0XFE(即161-254),共157种。

3、GBK是GB2312的扩展,是向上兼容的,因此GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含繁体字的编码,它与Big5编码之间的关系我还没有弄明白,好像是不一致的。GBK中每个汉字仍然包含两个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。

表1 汉字编码范围

名称

第一字节

第二字节

GB2312

0xB0-0xF7(176-247)

0xA0-0xFE(160-254)

GBK

0x81-0xFE(129-254)

0x40-0xFE(64-254)

Big5

0x81-0xFE(129-255)

0x40-0x7E(64-126)

0xA1-0xFE(161-254)

二、对汉字进行hash

为了处理汉字的方便,在查找汉字的时候,我们通常会用到hash的方法,那怎么来确定一个汉字位置呢?这就和每种编码的排列有关了,这里主要给出一种hash函数的策略。

对于GB2312编码,设输入的汉字为GBword,我们可以采用公式(C1-176)*94 + (C2-161)确定GBindex。其中,C1表示第一字节,C2表示第二字节。具体如下:

GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161;

之所以用unsigned char类型,是因为char是一个字节,如果用unsigend int,因为int是4个字节的,所以会造成扩展,导致错误。

对于GBK编码,设输入的汉字为GBKword,则可以采用公式   index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128),其中ch1是第一字节,ch2是第二字节。

具体的,

GBKindex = ((unsigned char)GBKword[0]-129)*190 +

((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;

三、怎样判断一个汉字的是什么编码

直接根据汉字的编码范围判断,对于GB2312和GBK可用下面两个程序实现。

1、判断是否是GB2312

bool isGBCode(const string& strIn)

{

unsigned char ch1;

unsigned char ch2;

if (strIn.size() >= 2)

{

ch1 = (unsigned char)strIn.at(0);

ch2 = (unsigned char)strIn.at(1);

if (ch1>=176 && ch1<=247 && ch2>=160 && ch2<=254)

return true;

else return false;

}

else return false;

}

2、判断是否是GBK编码

bool isGBKCode(const string& strIn)

{

unsigned char ch1;

unsigned char ch2;

if (strIn.size() >= 2)

{

ch1 = (unsigned char)strIn.at(0);

ch2 = (unsigned char)strIn.at(1);

if (ch1>=129 && ch1<=254 && ch2>=64 && ch2<=254)

return true;

else return false;

}

else return false;

}

3、对于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。

四、如果判断一个字符是西文字符还是中文字符

大家知道西文字符主要是指ASCII码,它用一个字节表示。且这个字符转换成数字之后,该数字是大于0的,而汉字是两个字节的,第一个字节的转化为数字之后应该是小于0的,因此可以根据每个字节转化为数字之后是否小于0,判断它是否是汉字。

例如,设输入字为strin,则,

If (strin.at(0) < 0)

cout << ”是汉字” << endl;

else cout << ”不是汉字” << endl;

 

五、编码表下载
    见附件

六、编码对照表
        http://www.herongyang.com/gb2312/

汉字编码对照表(gb2312/Big5/GB2312)相关推荐

  1. ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别

    ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别 最近老为编码问题而烦燥,下定决心一定要将其弄明白!本文主要总 结网上一些朋友提供的 asc ...

  2. Big5 = GBK GBK = Big5 GB2312 = GBK GBK = GB2312 互转

    本文将介绍四个转换函数分别实现如下的转换: Big5 => GBK GBK => Big5 GB2312 => GBK GBK => GB2312 有关 GB2312 =〉BI ...

  3. gbk, gb2312,big5,unicode,utf-8,utf-16的区别

    本文转自http://blog.chinaunix.net/uid-446337-id-94462.html详细说明了各种编码的区别于联系,对于支持国际化很重要,否则各种乱码能搞死人! Unicode ...

  4. 计算机一级仿宋gb2312,仿宋gb2312字体

    一般情况下,这款软件在试用的过程可能还有点小问题,但是正所谓瑕不掩瑜,相信用不了多久,只要程序猿给力点,这种小小的反馈不爽就可以解决. 仿宋gb2312字体字体简介 仿宋_GB2312字体是印刷字体的 ...

  5. Gb2312及Gb2312转Utf-8编码的UrlEncode编码解码(全)

    为了一个gb2312下post中文参数到utf-8页面的程序,随闷的难受,查了一下午资料,大部分是讲Gb2312传到Gb2312页面的UrlEncode,没有提供到Utf-8页面的UrlEncode, ...

  6. 【转】刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK等)以及全角、半角、CJK

    一.概述 1. 英文字母再加一些其他标点字符之类的也不会超过256个,用一个字节来表示一个字符就足够了(2^8 = 256).但其他一些文字不止这么多字符,比如中文中的汉字就多达10多万个,一个字节只 ...

  7. ASCII、ISO8859-1、GB2312、GBK、GB18030、BIG5、UNICODE、UTF-8、ANSI等字符集编码的讲解与特点

    世界是不断进步的,有了新需求就会产生新的事物.首先我们要知道在程序中经常遇到一些关于乱码的问题,而产生乱码的原因就是因为计算机直接存储字符时要把字符转为二进制,这其中不同的转换规则就对应不同的编码方式 ...

  8. VC中三种常见中文内码的转换方法(GB2312/GBK/BIG5)

    我们平时常见的三种中文内码是:GB2312(简体中文).GBK.BIG5(繁体中文).网上有很多中文内码的专用转换工具.我们碰到由于内码不一致而导致的乱麻问题,用这些工具可以进行相互转换.但论坛里经常 ...

  9. ASCII 、GB2312、GBK、GB18030、unicode、UTF-8字符集编码详解

    ASCII码表在线查询: http://www.weste.net/tools/ASCII.asp ASCII字符集编码 ASCII码是7位编码,字符在计算机中以其ASCII码方式表示,其长度为1个字 ...

  10. ASCII 、GB2312、GBK、GB18030、unicode、UTF-8字符集编码详解(转载)

    ASCII字符集编码 ASCII码是7位编码,字符在计算机中以其ASCII码方式表示,其长度为1个字节, 有符号字符型数.编码范围是0x00-0x7F(0~127).ASCII字符集包括英文字母.阿拉 ...

最新文章

  1. 最长有效括按号长度(利用栈解决java语言)
  2. 新网站如何推广 新建设的网站如何宣传
  3. Java线程详解(17)-原子量
  4. pwm控制的基本原理_最详细的电机控制说明
  5. CentOS 7下搭建配置 SVN 服务器
  6. PKU 学生反馈 3
  7. LeetCode —— 71.简化路径(Python3)
  8. 《PPT高手之道:六步变身职场幻灯派》一0.4 PPTology的3大阶段、6个步骤、24个模块...
  9. python百度关键词爬虫_python批量获取百度关键词相关结果数
  10. 迭代求解最优化问题——步长确定
  11. 设计师必备,素材网站如千图包图免费下载的方法
  12. Java获取名字首字母拼音及用户按名字拼音分组工具
  13. 一张图片放两个二维码_经验 | 图片排版的「17个实用技巧」
  14. 推荐10 款 C++ 在线编译器
  15. Spring Cloud在国内中小型公司能用起来吗?
  16. Python深度学习婴儿啼哭声分类识别,测试集准确率67.5%
  17. 【面试总结】网易2019秋招一站式面试总结(等offer中……)
  18. 三星砸钱买公司以提升Bixby性能 奋力追赶亚马逊谷歌
  19. 手机老是收不到短信验证码?我来告诉你为什么!
  20. 数据库系统概论 实验报告答案 实验三:创建及管理数据表

热门文章

  1. 3D游戏设计-打飞碟
  2. 计算机键盘盲打方法,【字母键盘练习方法指导】教你如何快速打字
  3. 虚拟串口服务器连接485转网口,串口服务器 串口转以太网 RS232转以太网 485转以太网 串口转网口...
  4. 使用分层的方法设计 机器人软件
  5. vs2015如何建立c语言程序,C语言快速入门——使用Visual Studio 2015创建控制台应用程序...
  6. 北京新东方全部托福资料
  7. 自己动手做一个爬虫项目
  8. 电脑硬盘怎么测试软件,如何通过软件检测电脑硬盘坏道?
  9. imx6ul pinctrl 驱动浅析
  10. 支持超过4000字节的varchar2类型