汉字编码问题

GB2312汉字编码表 立即下载
汉字编码问题
    由于常常要和汉字处理打交道,因此,我常常受到汉字编码问题的困扰。在不断的打击与坚持中,也积累了一点汉字编码方面的经验,想和大家一起分享。
一、汉字编码的种类
    汉字编码中现在主要用到的有三类,包括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是一个字节,如果用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;
 

五、编码表下载

   GBK编码表,下载

   GB2312编码表,下载 

gb2312_unicode_utf8汉字编码对照表 立即下载

相关推荐

汉字编码对照表

汉字编码对照表,里边有常见汉字的编码,文档以Excel的形式组织,很方便查找。

汉字的编码|ASCII|GBK|Unicode|UTF-8详解

字符集:是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符编码:在符号集合与二进制之间建立对应关系常用的字符集:ASCII字符集、GB2312字符集、BIG5字符集、GBK字符集、GB18030字符集、Unicode字符集等。

白帽阿叁的博客 3万+

AutoCAD提示找不到acdb24.dll、AcGe24.dll、AcPal.dll、AcUt.dll怎么办?

在我们安装了AutoCAD 2023版本以后,打开CAD,可能会出现dll文件丢失的情况,如下所示:1、由于找不到acdb24.dll,无法继续执行代码。重新安装程序可能解决此问题。2、由于找不到AcGe24.dll,无法继续执行代码。重新安装程序可能解决此问题。3、由于找不到AcPal.dll,无法继续执行代码。重新安装程序可能解决此问题。4、由于找不到AcUt.dll,无法继续执行代码。重新安装程序可能解决此问题。遇到AutoCAD启动系统错误,由于找不到dll文件该怎么处理呢?

huoxu369的博客 1万+

(转)GB2312简体中文编码表

http://tools.jb51.net/table/gb2312 GB2312简体中文编码表 GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。整个字符集分成94个区,每区有94个位。 GB2312,又称为GB0,由中国...

weixin_30802273的博客 1万+

二阶FLL辅助三阶PLL环路的代码解读

今天对GNSS接收机里面的载波跟踪环路代码进行了解读 以下是个人的一点见解 % 载波环第二步:环路滤波器 二阶FLL辅助三阶PLL环路 carrLoopS0 = lastCarrLoopS0 + (phaseErr*tau0PLL + freqErr*tau1FLL) * PDIcarr; carrLoopS1 = lastCarrLoopS1 + (tau1PLL*phaseErr + carrLoopS0 + tau2FLL*freqErr) * PD

LWN7321的博客 2631

TMC2209串口配置实战:从寄存器解析到电机精准控制

本文详细解析TMC2209步进电机驱动芯片的串口配置方法,从硬件连接到UART通信协议,再到核心寄存器功能详解。通过实战案例展示电流控制、微步细分和速度调节等关键配置,帮助工程师实现电机精准控制,并提供了常见故障诊断和优化技巧。

f6g7h8i9j的博客 1174

webkit处理汉字编码问题的总结

在XX项目中解决android webkit处理汉字编码问题的总结 问题: 服务器通过302重定向方式发送给客户端重定向地址,地址中的汉字采用原数据方式发送,没有经过任何编码。因为其中存在汉字,所以在android端经过webkit解码编码之后,最终无法正常在服务器端请求正确数据。Android中默认使用utf-8编码。   Android在framework中解析http

ghost045的专栏 1162

【机器学习】图神经网络(NRI)模型原理和运动轨迹预测代码实现

NRI模型利用VAE和GNN从观测数据中学习系统动态和交互图,展现出在无监督学习、图结构建模、多步预测和连续松弛方面的强大能力。未来工作可探索动态图结构学习、应用于更复杂系统、提高模型泛化能力和计算效率,以及与其他模型的结合。NRI作为新兴的图神经网络方法,在理解和预测相互作用系统方面潜力巨大,有望在各领域发挥重要作用。

MUKAMO的博客 2778

总结一下JSP/Servlet 中的汉字编码问题

问题的起源 每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展 ASCII 码 , 中国的 GB2312-80,日本的 JIS 等,作为该国家 / 区域内信息处理的基础,有着统一编码的重要作用。字符编码集按长度分为 SBCS(单字节字符集),DBCS(

jasontome的android之路:Do it. Do it right. Do it righ 752

【C2000系列DSP的Bootloader详解】实现过程、流程图与示例代码

C2000 Bootloader 的核心逻辑可概括为 “初始化→选模式→加载程序→校验→跳转” 五步。对于小白来说,无需纠结底层寄存器配置(驱动库已封装),重点理解 “启动流程” 和 “数据传输 + 校验” 的核心思想即可。 通过本文的流程图和示例代码,相信你已经掌握了 C2000 Bootloader 的核心原理。实际开发中,可基于 TI 提供的 Bootloader 示例(C2000Ware 中自带)进行修改,快速适配自己的硬件和应用场景。

昔时扬尘处 371

告别定位不准!Inner-IoU助力YOLOv11边界框回归精度飙升

Inner-IoU 凭借辅助边框的创新设计,成功解决了传统 IoU 损失在小目标、遮挡场景下的收敛难题,为 YOLOv11 注入了更强的定位能力。从原理剖析到代码集成,本教程已为你铺就了一条“精度提升”的实战路径。现在,不妨亲自上手尝试,让你的目标检测模型在各类数据集上都能交出一份“精度优异”的答卷——相信我,当你看到检测框精准贴合目标的那一刻,你会明白这份尝试的价值。

FJN110的博客 192

JSP/Servlet 中的汉字编码问题(转)

JSP/Servlet 中的汉字编码问题 网上就 JSP/Servlet 中 DBCS 字符编码问题有许多优秀的文章和讨论,本文对它们作一些整理, 并结合 IBM WebSphere Application Server 3.5(WAS)的解决方法作一些说明,希望它不是多余的。 1.问题的起源 每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的 ASCII,中国的 GB2312 -80,日本的 JIS 等,作为该国家/区域内信息处理的基础,有着统一编码的重要作用。字符编码

子曰:“志于道,据于德,依于仁,游于艺。” 1940

安装 miniconda linux

安装 miniconda linux

jacke121的专栏 1万+

JSP/Servlet 中的汉字编码问题

JSP/Servlet 中的汉字编码问题作者:Admin 来源:ASP中文网 加入时间:2004-3-28 JSP/Servlet 中的汉字编码问题 网上就 JSP/Servlet 中 DBCS 字符编码问题有许多优秀的文章和讨论,本文对它们作一些整理,并结合 IBM WebSphere Application Server 3.5(WAS)的解决方法作一些说明,希望它不是多余的。内容:问题的起源

710

03、AC分析

本节我们将对之前的BUCK电路进行AC分析! 首先,我们之前的BUCK电路是开环电路,现在我们把它设计成闭环电路!电路图如下: 我们对闭环BUCK电路先瞬态仿真一下,波形如下: 然后在电路中加入小信号和波特图进行AC仿真 原理图如下: 增益为0时所对应的相位裕度为56°,这个相位裕度一定要大于0°,大于45°则比较稳定! ...

soumns丶涛的博客 3519

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: FcpEditor v2.07.60完成新建模板
下一篇: Delphi的TWebBrowser编程综述
senfore
博客等级 码龄23年 5粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值