汉字编码解析

一、汉字编码的种类

汉字编码中现在主要用到的有三类,包括GBK,GB2312和Big5。

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是一个字节.

对于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;

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

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

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

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

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

If (strin.at(0) < 0)

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

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

补充:

1.汉字外部码

汉字外部码又称为汉字输入码,是指从键盘上输入汉字时采用的编码。汉字输入编码有很多种,目前广泛使用的输入码为:

① 国标区位码

② 以汉字读音为基础的拼音码,如全拼输入法、双拼输入法、词汇输入法、智能ABC输入法等;

③ 以汉字字形为基础的拼形码,如五笔字型输入法;

不同的汉字输入方法有不同的外码,但内码只能有一个。好的输入方法应具备规则简单、操作方便、容易记忆、重码率低、速度快等特点。

2.汉字国标码

GB2312-80编码简称国标码。由于汉字数量大,无法用一个字节进行编码,因此使用两个字节对汉字进行编码。规定两个字节的最高位用来区分ASCII码。这样国标码用两个字节的低7位对汉字进行编码。

一个字节只能有128-34=94种状态用于汉字编码(34是指34种控制字符),两个字节可以表示94×94=8836种状态。在基本集中汉字是按规则排列成94行和94列的矩阵,形成汉字编码表,其行号称为区号,列号称为位号,第一个字节表示汉字在国标字符集中的区号,第二个字节表示汉字在国标字符集中的位号。每一个汉字在94×94的矩阵中都有一个固定的区号和位号。

例如:汉字“大”的区号为20,位号为83,即“大”的区位码为2083。

国标码是以十六进制数字编码,编码范围是从2121H(21H即为十进制的33)到7F7FH(7FH即为十进制的127)。

因此,国标码=区位码(用十六进制表示)+2020H。

3.汉字机内码

机内码是指一个汉字被计算机内部系统进行存储、处理和传输时而使用的编码。为了保证中西文兼容,同时又能区分ASCII码和汉字,因此,机内码就是将国标码的两个字节的最高位置为“1”。

所以,机内码=国标码+8080H=区位码(用十六进制表示)+A0A0H 。

4.汉字字形码

字形码又称汉字字模,用于汉字的输出。汉字的字形通常采用点阵的方式产生。汉字点阵有16×16点阵、32×32点阵、64×64点阵,点阵不同,汉字字形码的长度也不同。点阵数越大,字形质量越高,字形码占用的字节数越多。

如图1.1是“国”字24×24的点阵字形。深色小正方形可以表示一个二进制位的信息“1”,浅色小正方形表示二进制位的信息“0”。

汉字字形码又称为汉字输出码或汉字发生器的编码。

例:按32×32点阵存放两级汉字的汉字库,大约需要占用多少字节?

解:32×32×6763÷8=865664B≈845KB

大约需要845KB。

java 汉字区位码表_汉字编码解析相关推荐

  1. java 编码解码_深入解析Java中的编码转换以及编码和解码操作

    一.Java编码转换过程 我们总是用一个java类文件和用户进行最直接的交互(输入.输出),这些交互内容包含的文字可能会包含中文.无论这些java类是与数据库交互,还是与前端页面交互,他们的生命周期总 ...

  2. java动态表单设计解析

    于雷劈网的表单设计器扩展,java实现后台解析(插件内容和字段和原版有一定改变).致敬雷劈网.http://formdesign.leipi.org/ 全部代码地址在 https://gitee.co ...

  3. java父子表_数据库二维表转父子关系,java,stream,list

    需求描述:把数据库中的省市二维表,查询到内存中后,转换为父子层级关系.通过jdk8中的stream方式实现. 数据关系: 320004    福建省    320507    南平市 430000   ...

  4. java 跳表_数据结构跳表学习并用Java实现

    前面学习很多类的源码过程中,底层基本都是数组和链表,今天学习第三种结构跳表(SkipList). 跳表解决的问题 一个有序的数组如果我们要判断一个数据是否存在可以通过二分查找法非常快速的判断出来,但是 ...

  5. java 广义表_数据结构:广义表的实现(Java)

    Java实现广义表: package 广义表; import java.util.Stack; public class Test { public final int TAG_TABLE = 1; ...

  6. java 跳表_跳表 skiplist

    最初知道跳表(Skip List)是在看redis原理的时候,redis中的有序集合使用了跳表作为数据结构.接着就查了一些资料,来学习一下跳表.后面会使用java代码来实现跳表. 跳表简介 跳表由Wi ...

  7. win7 java注册表_使用JAVA和JNA在64位Win 7上读/写Windows注册表

    我正在尝试使用JAVA在64位Win7上读/写 Windows注册表. 首先,我尝试了JDK java.util.prefs.Preferences and its reflection usage. ...

  8. java 杰表_【汉王OCR和杰表sdk(web报表二次开发包,java语言) 2.8哪个好用】汉王OCR和杰表sdk(web报表二次开发包,java语言) 2.8对比-ZOL下载...

    杰表sdk可以用来开发基于web的报表系统,使用杰表sdk可以使杰表系统系统更好的集成到您的项目中,本开发包通过几个不同环境下的代码示例,来说明如何使用杰表API,来新建,修改,发布,浏览,打印报表. ...

  9. java斗地主代码_实例解析java如何实现斗地主代码

    实例解析java如何实现斗地主代码 发布时间:2020-07-20 14:41:41 来源:亿速云 阅读:73 作者:小猪 小编这次要给大家分享的是实例解析java如何实现斗地主代码,文章内容丰富,感 ...

  10. java 杰表_简表

    简表介绍 简表(JOR),是一款开源的报表工具,完全java实现,核心代码来自于国内一线报表工具品牌杰表.2008 . 提起开源的报表工具,不能不说说jaspereport,jasperreport作 ...

最新文章

  1. 跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?(源码感悟)
  2. 异步通知和同步通知_CCF NOI 2020 网上同步赛报名通知
  3. 名词解释(容器、并发,插件,脚本)及程序对象的创建和注释文档
  4. Jmeter中JDBC Connection Configuration实现MySQL JDBC Request数据库处理
  5. 社群商业模式设计方案
  6. java ts流,Windows 合并多个*.ts文件
  7. 319@365 RStudio中rgl包安装后调用出错解决方法初探。
  8. 论文研读 —— 4. You Only Look Once Unified, Real-Time Object Detection (3/3)
  9. python corpora.Dictionary corpus dictionary.doc2bow 词袋模型转为稀疏矩阵 词向量 不要词袋模型
  10. Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering 论文阅读
  11. 深入浅出的 Adaboost算法
  12. python 单行if_python3绘图程序教学:单行If判断式(十三)
  13. C语言scanf()返回值以及EOF
  14. 最新水利水电安全员考试判断题库(2)
  15. php定义json类型数据,PHP中使用json数据格式定义字面量对象的方法_PHP
  16. linux下使用FFmpeg搭建视频推流拉流测试
  17. 海思3516DV300对接IMX327-60fps
  18. 项目_功能模块_基于Spring Boot的文件上传下载功能的设计与实现
  19. EDMA SEED 例程
  20. Could not download lifecycle-service.aar (androidx.lifecycle:lifecycle-service:2.0.0)

热门文章

  1. 正点原子STM32F103学习笔记(二)
  2. 动感标题文字快闪(闪白特效)开场PR模板MOGRT
  3. Python win32com模块安装
  4. 厨房电器机械EN60335-2-14检测标准及项目
  5. 怎么用psftp下载linux上的文件夹,使用PSFTP上传和下载Linux服务器文件.doc
  6. OpenDDS 编译
  7. 基于ssm的航空订票系统
  8. Maven的下载与配置(包含阿里云镜像配置)
  9. Vue中导出Excel
  10. uc如何HTML编辑,电脑端UC浏览器如何对书签进行编辑