汉字编码对照表(gb2312/unicode/utf8)

一、汉字编码的种类

    汉字编码中现在主要用到的有三类,包括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;

 

五、编码表下载
见附件

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: UTF-8汉字编码对照表(Universal Character Set Transformation Format - 8-bit)是一种用于在计算机存储和处理文本的编码方式,它是Unicode的一种变体。UTF-8编码支持世界上几乎所有的字符,包括中文字符。 UTF-8使用不同长度的字节序列来表示不同的字符。对于英文字母和数字等ASCII字符,UTF-8编码使用一个字节表示,与ASCII编码保持兼容;对于汉字等非ASCII字符,UTF-8编码使用两个或更多字节表示。 UTF-8编码的汉字范围是U+4E00至U+9FA5,共20902个字符。这个范围内包括了现代汉字、繁体汉字以及一些常用的生僻字。通过UTF-8编码,可以将这些汉字表示成一个或多个字节序列。 UTF-8汉字编码对照表列出了从U+4E00到U+9FA5的所有汉字及其对应的UTF-8编码。每个汉字在UTF-8编码中占用的字节数可能不同,但都能表示准确的字符。例如,UTF-8编码中汉字“中”对应的编码是E4 B8 AD。 使用UTF-8编码方式有很多好处。首先,它能够容纳世界上各个语言的字符,不再受到字符集的限制。其次,UTF-8编码是可变长度的,对于英文等ASCII字符,使用一个字节表示,比传统的编码方式更节省空间。最后,UTF-8编码是逐渐取代其它编码方式成为国际通用编码,减少了字符转换的麻烦。 总之,UTF-8汉字编码对照表包含了所有汉字字符及其对应的编码,在实际应用中使用UTF-8编码方式能够更好地支持汉字和其他语言的字符表示,并促进跨语言的信息交流和数据处理。 ### 回答2: UTF-8汉字编码对照表是一种用于将汉字字符映射到计算机系统中的编码系统。UTF-8是一种可变长度的编码方式,它可以将Unicode中的所有字符以字节形式表示。UTF-8编码是一种兼容ASCII编码的方式,即使用一个字节表示ASCII字符,而使用多个字节表示非ASCII字符,这使得在使用UTF-8编码的系统中,可以同时处理ASCII字符和汉字字符。 汉字在Unicode中的编码范围是0x4E00到0x9FFF,这个范围内的每一个汉字都有一个对应的Unicode码点。在UTF-8中,每一个Unicode码点通过一系列的字节表示。对于汉字而言,它的编码范围超出了ASCII编码的范围,因此需要使用多个字节来表示,具体的字节个数取决于汉字的编码范围。 UTF-8汉字编码对照表列出了每一个汉字及其对应的UTF-8编码的字节序列。比如,汉字“中”对应的Unicode码点是0x4E2D,而在UTF-8中它的编码字节序列是0xE4B8AD。这个字节序列包含了三个字节,每个字节的高位为1,后面的7位是表示该字节所包含的数据。通过这个字节序列,计算机系统可以正确地识别和处理这个汉字字符。 对照表可以帮助开发人员在处理汉字字符时正确地转换和解码UTF-8编码。在编程和网页设计中,使用UTF-8编码对照表可以帮助开发人员准确地处理和显示汉字字符,确保文字内容的准确性和兼容性。 ### 回答3: UTF-8是一种用于存储和传输Unicode字符的可变长度编码方案。UTF-8编码使用1到4个字节来表示一个Unicode字符,其中汉字占用3个字节。 UTF-8汉字编码对照表是一个包含Unicode字符与对应的UTF-8编码表示之间关系的表格。该表格列出了Unicode编码范围内的所有字符及其对应的UTF-8编码。 UTF-8编码是一种多字节编码方案,使用不同长度的字节序列来表示不同的字符。在UTF-8编码中,ASCII字符使用1个字节表示,而Unicode范围内的其他字符则使用多个字节表示。 UTF-8汉字编码对照表通过列出Unicode编码范围内的汉字字符及其对应的UTF-8编码,方便人们在实际应用中进行编码转换和字符处理。 在UTF-8汉字编码对照表中,可以找到汉字的Unicode编码,例如"你"字的Unicode编码为U+4F60。然后可以根据UTF-8编码规则,将Unicode编码转换为对应的UTF-8字节序列,例如"你"字的UTF-8编码为E4BDA0。 通过UTF-8汉字编码对照表,我们可以方便地进行汉字的编码转换和字符处理。无论是在编程中处理字符串,还是在网络传输中使用UTF-8编码进行数据传输,都可以依靠UTF-8汉字编码对照表来确保汉字的正确表示和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值