`
ongsh321
  • 浏览: 101262 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

汉字编码问题(转)

阅读更多


由于常常要和汉字处理打交道,因此,我常常受到汉字编码问题的困扰。在不断的打击与坚持中,也积累了一点汉字编码方面的经验,想和大家一起分享。

一、汉字编码的种类

    汉字编码中现在主要用到的有三类,包括GBKGB2312Big5

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

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

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

 

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

 

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

                                    

                                   汉字编码范围

名称

第一字节

第二字节

GB2312

0xB0-0xF7(176-247)

0xA0-0xFE160-254

GBK

0x81-0xFE129-254

0x40-0xFE64-254

Big5

0x81-0xFE129-255

0x40-0x7E64-126

0xA10xFE161-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,因为int4个字节的,所以会造成扩展,导致错误。

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

 

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

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

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

    它的范围为:高字节从0xA00xFE,低字节从0x400x7E,和0xA10xFE两部分。判断一个汉字是否是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编码表,下载

 

分享到:
评论

相关推荐

    汉字编码转换工具(汉字与utf-8转换 gb2312转换 unicode 转转

    总的来说,汉字编码转换工具是处理跨平台、跨系统汉字编码问题的利器,尤其在处理多源数据集成、文本处理、文件格式转换等场景下显得尤为重要。通过理解各种编码格式的特点和应用场景,我们可以更好地利用这款工具,...

    汉字编码转换为字节码工具

    总的来说,"汉字编码转换为字节码工具"是计算机处理汉字字符的关键技术之一,它简化了编码转换的过程,提高了工作效率,并且对于理解和解决与汉字编码相关的各种问题具有重要意义。通过深入学习和熟练运用这类工具,...

    汉字编码问题编码问题

    在处理文档时,如"汉字编码问题.doc",我们需要确保知道文档的原始编码,才能正确读取和保存内容,避免乱码。 总的来说,汉字编码问题涉及到字符集、编码规则以及编码转换等多个方面。深入理解这些概念,对于开发...

    GBK编码转换汉字,汉字转换GBK编码,VC代码实现

    总之,GBK编码和汉字转换,以及BCD和ASCII编码的转换,都是在编程中处理字符编码问题的重要技能。通过理解这些原理和实践方法,开发者能够更好地处理各种编码问题,确保程序在不同环境下的兼容性和正确性。在VC++...

    汉字编码转换(内包含源代码MFC编写)

    汉字编码转换是一个重要的计算机编程领域,特别是在处理中文字符时。MFC(Microsoft Foundation Classes)是微软提供的一种C++库,用于构建Windows应用程序。这个压缩包中的资源,"汉字编码转换器",是一个基于MFC...

    gb18030的汉字编码,Unicode汉字编码表

    汉字编码是计算机处理汉字的关键技术,它涉及到不同的字符集和编码标准。在IT行业中,理解和掌握汉字编码对于处理中文字符的存储、传输和显示至关重要。本文将深入探讨GB18030、GBK、Unicode这三种汉字编码以及它们...

    汉字编码转换器-对文字进行各种编码的工具

    总之,汉字编码转换器是处理中文字符编码问题的有效工具,能够帮助用户解决因编码不匹配而产生的各种问题,确保信息的准确传递和显示。在日常的编程、网页制作或数据处理中,它都扮演着不可或缺的角色。

    汉字编码转换

    汉字编码转换是计算机科学领域中的一个重要知识点,尤其是在处理中文字符时。这个过程涉及到将汉字从其文本形式转换成不同类型的编码表示,以便于计算机存储、处理和传输。下面将详细介绍汉字编码转换的主要方面,...

    汉字编码转换软件(中文转为编码)

    3. 编码转换工具:除了TestChineseCode,还有许多其他工具,如Notepad++、EmEditor等,它们提供了编码转换的功能,方便用户处理各种编码问题。 总的来说,汉字编码转换软件是连接人类语言和计算机语言的桥梁,对于...

    汉字编码器(exe格式)

    - 解析文本:帮助程序员理解文本中的汉字编码,解决乱码问题。 5. **使用汉字编码器的注意事项**: - 需要了解目标系统或软件支持的编码格式,否则可能导致乱码。 - 某些编码器可能仅支持特定编码,如本例中的...

    汉字编码培训 ppt

    此外,还可能涵盖了如何在编程语言中处理汉字编码,例如在Java、Python或C#中进行字符串操作时需要注意的编码问题,以及在网页开发中设置和处理不同编码的技巧。 学习汉字编码对于理解中文信息处理至关重要,它可以...

    java中汉字编码问题

    ### Java中汉字编码问题详解 在Java开发过程中,汉字编码问题常常给开发者带来困扰,特别是在涉及国际化或多语言环境的应用开发中。本文将详细介绍在Java环境中遇到的汉字编码问题及其解决方案,帮助开发者更好地...

    汉字编码相互转换支持简繁、ANSI UTF8

    无论是开发软件、编写网页还是处理数据,掌握这些知识都能帮助我们更好地应对各种编码问题,提高工作效率。在处理跨地区的中文内容时,简繁体转换工具更是不可或缺。而“code.exe”这样的实用程序,无疑为我们的工作...

    汉字编码及其演进关系

    ### 汉字编码及其演进关系 #### 引言 随着信息技术的发展,汉字编码成为连接计算机技术与中文使用者之间的重要桥梁。本文旨在探讨汉字编码的发展历程及其在信息技术领域中的重要性,尤其聚焦于国内汉字编码标准的...

    汉字转编码工具.汉字转编码工具.

    总之,汉字转编码工具是处理汉字编码问题的重要工具,它可以帮助我们跨越编码障碍,确保信息的准确传递和显示。无论是个人还是专业开发者,了解并熟练使用这类工具,都将对日常的IT工作带来极大的便利。

    汉字编码PPT课件.pptx

    在计算机科学中,汉字编码技术是处理汉字信息的关键环节,它涉及将汉字转换为二进制形式,以便计算机能够识别、存储、处理和显示。汉字编码PPT课件详细阐述了处理汉字信息的两种重要编码体系:ASCII码和国标码。 ...

    GB2312,UTF8,UCS2汉字编码生成与转换工具

    用户下载后,可以按照指示安装并使用这个工具,以解决在处理汉字编码时遇到的问题。无论是开发者还是普通用户,了解和掌握这些编码知识,以及如何利用工具进行转换,都是提升工作效率、避免乱码问题的重要技能。

Global site tag (gtag.js) - Google Analytics