`
fengyie007
  • 浏览: 153712 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

汉字编码问题

阅读更多
由于常常要和汉字处理打交道,因此,我常常受到汉字编码问题的困扰。在不断的打击与坚持中,也积累了一点汉字编码方面的经验,想和大家一起分享。
一、汉字编码的种类
    汉字编码中现在主要用到的有三类,包括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又称大五码,主要为香港与台湾使用,即是一个繁体字编码。每个汉字由两个字节构成,第一个字节的范围从0X810XFE(即129-255),共126种。第二个字节的范围不连续,分别为0X400X7E(即64-126),0XA10XFE(即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-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,因为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;
 
分享到:
评论

相关推荐

    汉字编码问题总结

    汉字编码问题总结 GB2312-80 编码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。GB2312 收录...

    汉字编码问题编码问题

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

    JSP Servlet 中的汉字编码问题

    JSP Servlet 中的汉字编码各种问题解决方法

    java中汉字编码问题

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

    JSPServlet 中的汉字编码问题

    ### JSP Servlet 中的汉字编码问题详解 #### 一、问题背景 在计算机科学领域,尤其是在Web开发中,字符编码问题一直是开发者面临的一个常见难题。特别是在处理非英文字符时,如中文字符,很容易遇到编码不匹配导致...

    java应用中的汉字编码问题

    本资料将深入探讨Java中的汉字编码问题,帮助开发者理解并解决可能出现的乱码现象。 首先,我们需要理解编码的基本概念。编码是将字符转换为二进制表示的过程,而解码则是相反的过程。在Java中,最常用的字符编码...

    JSP-Servlet中的汉字编码问题-JSP教程

    ### JSP-Servlet中的汉字编码问题详解 #### 一、引言 在Web开发中,尤其是在使用JavaServer Pages (JSP) 和 Servlet 进行页面处理时,字符编码问题是经常遇到的技术难题之一。本文将围绕“JSP-Servlet中的汉字编码...

    JSP_Servlet 中的汉字编码问题.pdf

    ### JSP/Servlet中的汉字编码问题详解 #### 一、问题背景及重要性 在互联网技术的发展历程中,字符编码一直是影响多语言支持的关键因素之一。对于中文等双字节字符集(DBCS)而言,正确的编码处理尤为重要。《JSP_...

    汉字编码问题,GBK,Unicode

    ### 汉字编码问题详解:GBK与Unicode #### 一、GB2312-80 **GB2312**是中国最早制定的一种汉字信息交换编码标准,全称《信息交换用汉字编码字符集—基本集》。这项标准由中国国家标准总局发布,并于1981年5月1日...

    JSP与Servlet中的汉字编码问题.pdf

    JSP与Servlet中的汉字编码问题.pdf

    航信汉字编码与解码/eterm汉字编码与解码

    航信汉字的编码与解码,编码便于使自己的pid进行汉字传输, 航信汉字编码与解码,eterm汉字编码与解码,汉字编码问题

    JSP/Servlet 中的汉字编码问题

    JSP/Servlet 中的汉字编码问题 网上就 JSP/Servlet 中 DBCS 字符编码问题有许多优秀的文章和讨论,本文对它们作一些整理,并结合 IBM WebSphere Application Server 3.5(WAS)的解决方法作一些说明,希望它不是多余...

    汉字编码的问题

    首先,我们来了解一下汉字编码问题可能出现的场景: 1. **获取参数**:在如Tomcat这样的服务器上,`Request.getParameter()`默认编码是ISO8859-1。当接收到包含汉字的参数时,需要将参数转换为GB2312或其他合适的...

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

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

    hanzibianma.rar_汉字 编码

    本文将深入探讨汉字编码的相关概念、常见编码方式以及如何在实践中应对汉字编码问题。 首先,我们要理解什么是字符编码。字符编码是一种规则,它将字符(如汉字)映射为特定的数字,使得计算机能够识别和处理这些...

    汉字编码简明对照表

    2. **兼容性**: 不同操作系统和应用程序之间的兼容性问题是汉字编码需要解决的关键问题之一。 3. **高效性**: 随着大数据时代的到来,如何提高汉字编码的存储和处理效率成为研究的重点。 4. **安全性**: 在网络安全...

    汉字编码—源码.zip

    汉字编码在计算机科学中扮演着至关重要的角色,尤其是在...这些源码示例可能是函数、方法或整个类,帮助开发者解决实际项目中遇到的汉字编码问题。通过分析和实践,可以加深对C#处理汉字编码能力的理解,提升编程技能。

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

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

Global site tag (gtag.js) - Google Analytics