精华内容
下载资源
问答
  • 汉字编码

    千次阅读 2007-11-07 08:32:00
    汉字编码问题 由于常常要和汉字处理打交道,因此,我常常受到汉字编码问题的困扰。在不断的打击与坚持中,也积累了一点汉字编码方面的经验,想和大家一起分享。 一、汉字编码的种类 汉字编码中现在主要用到的有三类...
    汉字编码问题 
    由于常常要和汉字处理打交道,因此,我常常受到汉字编码问题的困扰。在不断的打击与坚持中,也积累了一点汉字编码方面的经验,想和大家一起分享。
    一、汉字编码的种类
    汉字编码中现在主要用到的有三类,包括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)
    -------- ¦------------------------- ¦-------------------------
    GBK0         ¦     x81-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; 
     
    展开全文
  • 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

    万次阅读 多人点赞 2014-02-15 16:46:22
    默认编码:System(简体中文windows系统默认指的是GBK编码,即下拉框选项里的GBK/windows-936-2000/CP936/MS936/windows-936) 二、编码知识科普 Qt常见的两种编码是:UTF-8和GBK ★UTF-8:Unicode Transformat

    尊重作者,支持原创,如需转载,请附上原地址:https://blog.csdn.net/libaineu2004/article/details/19245205

    这篇文章有点长,内容有点多,如果时间急迫,可以直接翻页去末尾看结论。红色字体加粗的。(#^.^#)

     

    一、Qt Creator环境设置

    1、cpp或h文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.

    我们使用的Windows系统本地字符集编码为GBK。

    2、Windows环境下,Qt Creator,菜单->工具->选项->文本编辑器->行为->文件编码->默认编码,常用的选项有以下几个:

    System(简体中文windows系统默认指的是GBK编码)

    GBK/windows-936-2000/CP936/MS936/windows-936

    UTF-8

     

    二、编码知识科普

    Qt常见的两种编码是:UTF-8和GBK
    ★UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如果是UTF8编码,则在外国人的英文IE上也能显示中文,他们无需下载IE的中文语言支持包。
    ★GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。GBK是GB2312的扩展,除了兼容GB2312外,它还能显示繁体中文,还有日文的假名。
    ★GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
    GBK、GB2312--Unicode--UTF8
    UTF8--Unicode--GBK、GB2312
    ★在简体中文windows系统下,ANSI编码代表GBK/GB2312编码,ANSI通常使用0x80~0xFF范围的2个字节来表示1个中文字符。0x00~0x7F之间的字符,依旧是1个字节代表1个字符。Unicode(UTF-16)编码则所有字符都用2个字节表示。

     

    三、编码转换

    Windows自带的记事本,无法查看UTF-8编码的文件到底有无BOM,需要使用其他文件编辑器,比如EditPlus或者SublimeText。
    UTF-8与ANSI(即GBK)的互转,可以使用EditPlus工具"文件另存为"或者Encodersoft编码转换工具对.cpp和.h源文件文本进行批量转换.

     

    四、QString显示中文乱码的原因

    我们使用的Windows系统本地字符编码(Local字符集)为GBK。编译器分析出源文件字符编码之后,会进行解码再编码,将源字符集转码成执行字符集。执行字符集一般默认为使用本地字符编码(Local字符集)。

    Qt5可以设置Local字符集,GBK/UTF-8

    QTextCodec *codec = QTextCodec::codecForName("UTF-8");//或者"GBK",不分大小写
    QTextCodec::setCodecForLocale(codec);

    Qt5中QString内部采用unicode字符集,utf-16编码。构造函数QString::QString(const char *str)默认使用fromUtf8(),将str所指的执行字符集从utf-8转码成utf-16。
    由上面fromUtf8()可知,QString需要执行字符集编码为utf-8,然后以utf-8进行解码,再编码为utf-16才能获得正确的字符编码。显示中文乱码的原因其实就是QString转码方式与执行字符集不一致。(比如,源字符集为本地字符集GBK编码,QString以utf-8的方式进行解码,会导致获得错误的二进制编码,再将错误二进制转为utf-16就会出现乱码。)
     

    五、Qt编码指定

    Qt需要在main()函数指定使用的字符编码:

    #include <QTextCodec>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        //设置中文字体  
        a.setFont(QFont("Microsoft Yahei", 9));
    
        //设置中文编码
    #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    #if _MSC_VER
        QTextCodec *codec = QTextCodec::codecForName("GBK");
    #else
        QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    #endif
        QTextCodec::setCodecForLocale(codec);
        QTextCodec::setCodecForCStrings(codec);
        QTextCodec::setCodecForTr(codec);
    #else
        QTextCodec *codec = QTextCodec::codecForName("UTF-8");
        QTextCodec::setCodecForLocale(codec);
    #endif
    
        return a.exec();
    }

    这里只列举大家最常用的3个编译器(微软VC++的cl编译器,Mingw中的g++,Linux下的g++),源代码分别采用GBK和无BOM的UTF-8以及有BOM的UTF-8这3种编码进行保存,发生的现象如下表所示。

    情况1:指的是Local字符集为GBK

    情况2:指的是Local字符集为UTF-8

    • 源代码的编码

      编译器

      显示正常

      显示乱码

      GBK

      win vs cl

      情况1

      情况2

      win mingw-g++

      情况1

      情况2

      linux g++

      情况1

      情况2

      UTF-8(无BOM)

      win vs cl

      编译失败

      error C2001: 常量中有换行符

      编译失败
      error C2001: 常量中有换行符

      win mingw-g++

      情况2

      情况1

      linux g++

      情况2

      情况1

      UTF-8(有BOM)

      win vs cl

      情况1

      情况2(有#pragma预处理)

      情况2(没有#pragma预处理)

      win mingw-g++

      情况2

      情况1

      linux g++

      情况2

      情况1
    • 如果您使用的是Visual C++编译器,则默认情况下不会将您的源代码视为utf-8编码。除非有BOM,否则它将使用您当前的代码页进行解释。就是说,当使用Visual C++编译程序的时候,它会分析源文件采用何种编码,有BOM标识符则可以正确识别其编码是UTF-8,若没有BOM标识符则认为其使用本地字符集编码(Local字符集)。Local字符集是什么?取决于你的设置QTextCodec *codec = QTextCodec::codecForName(???);
    • 如果源文件是UTF-8+BOM的编码方式,还需要在头文件加入
    #if defined(_MSC_VER) && (_MSC_VER >= 1600)    
    # pragma execution_character_set("utf-8")    
    #endif

    或者添加QMAKE_CXXFLAGS += /utf-8到您的.pro文件中。

    • 如果源文件是UTF-8+无BOM的编码方式,则一定不能加#pragma execution_character_set(“utf-8”),不然会产生乱码。

     

    六、测试案例

    案例1、中文字符串测试

    #if defined(_MSC_VER) && (_MSC_VER >= 1600)    
    # pragma execution_character_set("utf-8")    
    #endif
    
    #include <QApplication>
    #include <QTextCodec>
    #include <QPushButton>
    #include <QDebug>
    #include <QString>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        //设置中文字体  
        a.setFont(QFont("Microsoft Yahei", 9));
    
        //设置中文编码
    #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    #if _MSC_VER
        QTextCodec *codec = QTextCodec::codecForName("gbk");
    #else
        QTextCodec *codec = QTextCodec::codecForName("utf-8");
    #endif
        QTextCodec::setCodecForLocale(codec);
        QTextCodec::setCodecForCStrings(codec);
        QTextCodec::setCodecForTr(codec);
    #else
        QTextCodec *codec = QTextCodec::codecForName("utf-8");
        QTextCodec::setCodecForLocale(codec);
    #endif
    
        QString str(QObject::tr("1中文"));
        qDebug() << str;
        qDebug() << QStringLiteral("2中文");
        qDebug() << QString::fromLatin1("3中文");
        qDebug() << QString::fromLocal8Bit("4中文");
        qDebug() << QString::fromUtf8("5中文");
        qDebug() << QString::fromWCharArray(L"6中文");
    
        return a.exec();
    }

    当QTextCodec::codecForName("utf-8");时,

    QString::fromLocal8Bit和QString::fromUtf8是等效的。

    当QTextCodec::codecForName("gbk");时,

    QString::fromLocal8Bit和QString::fromUtf8是不等效的。

    案例2、QCom跨平台串口调试助手(http://www.qter.org/?page_id=203)
    源代码qcom\mainwindow.cpp,aboutdialog.cpp等文件用的是UTF-8编码(无BOM);但是qcom\qextserial\*.*文件用的是ANSI编码.在linux环境编译完全OK.
    笔者Windows环境的Qt Creator+微软VC++编译器,环境设置用的是ANSI(即GBK)编码.编译源文件会报错.
    错误提示"fatal error C1018: 意外的 #elif".


    解决方法由两种:

    方法1:

    把qcom\的所有cpp和h文件都用工具转换成ANSI编码,main()函数使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

    方法2:

    先把Qt Creator环境设置用的是UTF-8编码,

    再把qcom\的所有cpp和h文件都用工具转换成UTF-8+BOM编码,请注意,如果文件转换成UTF-8(无BOM),编译仍会失败.main()函数使用QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));//注意,此处仍是"GBK",不是"UTF-8"
    重新编译,OK!

    其它:

     

    七、结论

    Windows环境下,Qt Creator+微软VC++编译器,新建工程,

    1、如果该工程不需要跨平台使用(只在win),那么工程设置请使用GBK的编码方式.

    2、如果该工程要跨平台使用(win+linux),那么工程设置请使用UTF-8+BOM的编码方式.

    另外,还需要在预编译头文件加入

    #if defined(_MSC_VER) && (_MSC_VER >= 1600)    
    # pragma execution_character_set("utf-8")    
    #endif

    或者添加QMAKE_CXXFLAGS += /utf-8到您的.pro文件中。

    3、Linux环境下,Qt Creator+gcc,新建工程,

    没有GBK编码可选,默认是UTF-8(无BOM)编码方式,考虑到跨平台,建议选择UTF-8+BOM的编码方式.

     

    ★★★★★★★★★★★★★★★综上所述,解决乱码的方法概括如下:★★★★★★★★★★★★★★★★★★★★★

    1、如果IDE是Qt Creator,把它的环境设置为“UTF-8+BOM”编码。

    2、如果IDE是Visual Studio,请下载插件,名称是ForceUTF8 (with BOM),所有源文件和头文件都会保存为“UTF-8+BOM”编码。

    3、如果编译器是MSVC,请在预编译头stdafx.h文件加入

    #if defined(_MSC_VER) && (_MSC_VER >= 1600)    
    # pragma execution_character_set("utf-8")    
    #endif

    4、源码文件main函数入口设置中文编码:

        #include <QTextCodec>

        QApplication a(argc, argv);

        //设置中文字体  
        a.setFont(QFont("Microsoft Yahei", 9));

    //设置中文编码
    #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
    #if _MSC_VER
        QTextCodec *codec = QTextCodec::codecForName("gbk");
    #else
        QTextCodec *codec = QTextCodec::codecForName("utf-8");
    #endif
        QTextCodec::setCodecForLocale(codec);
        QTextCodec::setCodecForCStrings(codec);
        QTextCodec::setCodecForTr(codec);
    #else
        QTextCodec *codec = QTextCodec::codecForName("utf-8");
        QTextCodec::setCodecForLocale(codec);
    #endif

    5、如此一来,不管是MSVC编译器还是MinGW编译器,都能编译通过,且支持中文!

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

     

    x、参考文献

    Qt官网文档 

    https://wiki.qt.io/Strings_and_encodings_in_Qt

    https://doc.qt.io/qt-5/unicode.html

    ASCII,Unicode和UTF-8完全搞清楚 https://blog.csdn.net/Deft_MKJing/article/details/79460485

    Qt中文乱码原因及解决方案 https://blog.csdn.net/qq_35905572/article/details/95042444

    Qt中文乱码问题 http://blog.csdn.net/brave_heart_lxl/article/details/7186631

    尊重作者,支持原创,如需转载,请附上原地址:https://blog.csdn.net/libaineu2004/article/details/19245205

     

     

    展开全文
  • 汉字编码问题

    千次阅读 2019-01-07 23:37:17
    由于常常要和汉字处理打交道,因此,我常常受到汉字编码问题的困扰。在不断的打击与坚持中,也积累了一点汉字编码方面的经验,想和大家一起分享。 一、汉字编码的种类  汉字编码中现在主要用到的有三类,包括GBK...
    由于常常要和汉字处理打交道,因此,我常常受到汉字编码问题的困扰。在不断的打击与坚持中,也积累了一点汉字编码方面的经验,想和大家一起分享。

    一、汉字编码的种类

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

        1、GB2312又称国标码,由国家标准总局发布,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种。

     

        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;

     

    五、编码表下载

       GBK编码表,下载

       GB2312编码表,下载

    展开全文
  • 汉字编码及显示原理总结

    千次阅读 2017-10-12 22:25:46
    汉字编码及显示原理总结

    汉字      显示           原理

    一·显示过程:

    键盘敲击      产生     > 外码       转换   >机内码      查   找   >字库(输出码)      显示     >屏幕

    ①外码

    汉字输入码(外码)是指用户从键盘上键入汉字时所使用的汉字编码。

    例如:

    数字编码:区位码;

    拼音编码:全拼、双拼、微软拼音输入法、自然码、智能ABC、搜狗等

    字形编码:五笔、表形码、郑码输入法等。

    ②汉字机内码 :

    汉字机内码,又称“汉字ASCII码”,简称“内码”,指计算机内部存储,处理加工

    和传输汉字时所用的由0和1符号组成的代码。外码到汉字机内码不是直接转换

    的 如汉字区位码转换位汉字机内码 :区位码先转换为国标码(GB2312) 

    (其实国标码就是十六进制的区位码) 汉字机内码=国标码+8080H  ;
    我认为国标码就相当于一种中间码,为什么国标码要加8080H才是汉字机内码呢?

    这个是为了兼容 ASCII 码而设定的,我们知道 ASCII 码一共有 127 个,也就是从

    0x00~0x77F[ASCII的最高位都为0]。加上0x80是为了使得每个字节的最高位为1,

    这样就可以在内存中区分汉字和ASCII了。


    ③字库(输出码)

    字库(输出码):文字在 屏幕 上面显示,其实也就是在一定范围内显示一些点,

    不显示一

    些点,从而构成一个文字显示出来,而我们的字库其实也就是存储这些文字的点阵

    数据 。国标码对应的 点阵数据存储的顺序就是按照区位码顺序存储的:所有的国

    标码汉字及符

    号组成一个94行94列的二维代码表(字库)。在此方阵中,每一行称为一个"区",

    每一列称为一个"位"。这个方阵实际上组成一个有94个区(编号由01到94),每个

    区有94个位(编号由01到94)的汉字字符集。每个字节分别用两位十进制编码,前

    字节的编码称为区码,后字节的编码称为位码,此即区位码,其中,高两位为区号,

    低两位为位号。这样区位码可以唯一地确定某一汉字或字符;反之,任何一个汉字

    或符号都对应一个唯一的区位码。(国标码并不等于区位码,它是由区位码稍作转

    换得到,其转换方法为:先将十进制区码和位码转换为十六进制的区码和位码)

    二·其他:

    汉字编码有好多种除了GB2312(国标码),还有GBK,BIG5,UNICODE等,

    对于国标码原则上,两个字节可以表示 256×256=65536 种不同的符号,作为

    汉字编码表示的基础是可行的。但考虑到汉字编码与其它国际通用编码,如ASCII 西

    文字符编码的关系,我国国家标准局采用了加以修正的两字节汉字编码方案,只用了

    两个字节的低7位。这个方案可以容纳 128×128=16384 种不同的汉字,但为了与标准

    ASCII码兼容,每个字节中都不能再用32个控制功能码和码值为32的空格以及127的操

    作码。故每个字节只能有94个编码,所以双七位实际能够表示的字数是:94×94=8836个,

    为国际字符集编码标准只和ASCII编码兼容。GB2312一共收录了7445个字符,包括6763个

    汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位

    是72*94=6768。其中有5个空位是D7FA-D7FE。GB2312支持的汉字太少。1995年的汉字

    扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个

    字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,

    同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。

      Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言

    文字的编码方案。

    BIG5是繁体字的编码


    展开全文
  • python 汉字编码

    千次阅读 2015-09-02 13:54:43
    在处理一段文本的时候,首先了解文本的汉字编码。在windows下默认的文件编码是GBK,而 linux的一般是utf-8. 想要查看文件的编码方式,使用vim打开文本,然后在命令行模式下输入:set fileencoding,回车 即可...
  • 汉字编码范围

    千次阅读 2014-03-03 10:29:29
    汉字编码范围 GB2312 0xA1A1 - 0xFEFE GBK 0×8140 - 0xFEFE BIG5 0xA140 - 0xF9FE, 0xA1A1 - 0xF9FE  UTF-8   中文全角空格:\0xa1a1(GBK), \u3000(UTF-8) GB2312 范围: 0xA1A1 - 0x
  • GBK汉字编码

    万次阅读 2013-08-16 22:34:02
    基本简介    GB码,全称是GB2312-80《信息交换用汉字编码...P-Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号
  • 锦衣卫密信:JYW汉字编码

    千次阅读 2013-10-22 14:10:46
    为了适合短信加密的需要,特别制作了JYW汉字编码。 JYW汉字编码主要是双字节编码,高位字节在0x80~0xEF之间,低位字节在0x01~0xFF之间,一共可以存储32385个汉字。 JYW汉字编码也可以扩展成四字节编码即两组双字节...
  • 判断汉字 编码方式

    千次阅读 2011-11-18 14:27:45
    由于常常要和汉字处理打交道,因此,我常常受到汉字编码问题的困扰。在不断的打击与坚持中,也积累了一点汉字编码方面的经验,想和大家一起分享。 一、汉字编码的种类  汉字编码中现在主要用到的有三类,包括GBK...
  • utf8汉字编码对照表

    千次阅读 2017-09-29 13:49:15
    原文地址::... 相关文章 1、Unicode汉字编码表----https://wenku.baidu.com/view/2bad7f52f01dc281e53af07d.html 2、gb18030的汉字编码----https://wenku.baidu.com/view
  • 【转】汉字编码常识

    千次阅读 2016-12-14 10:27:08
     (1) CSDN博主sunjing的博文《汉字编码常识》,链接为:http://blog.csdn.net/sunjing/article/details/6162439。  (2) 学步园博主www5888888的博文《谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词》,...
  • 1980年,我国颁布了汉字编码的标准:GB2312-80《信息交换汉字编码字符集》,简称国标码。国标码是4位十六进制数组成。 3. 区位码 GB2312是一种汉字编码方式,具体由区位码实现,GB2312将所有汉字编入一个94*94的二维...
  • 请问这是哪种汉字编码? a10d59e4462bd9361bc68ac5bdfed65d78e00e4a5012f167c5487c55b9077d4673fa70a5de635ab3d9aca1eb3b9f0f21bacbce2eb42ee67dfe88cb406874e5dbfa6cfc17dcff071ded4cd27d82157606
  • 调用ord(‘汉’)函数可得到汉字编码对应的整型值
  • 汉字编码及区位码查询算法

    千次阅读 2016-12-03 07:59:35
    为了使每一个汉字有一个全国统一的代码,1980年,我国颁布了第一个汉字编码的国家标准:GB2312-80《信息交换用汉字编码字符集》基本集,这个字符集是我国中文信息处理技术的发展基础,也是目前国内所有汉字系统的...
  • GBK汉字编码范围

    千次阅读 2013-06-30 19:14:35
    汉字编码范围备注 编码范围 1. GBK (GB2312/GB18030) x00-xff GBK双字节编码范围 x20-x7f ASCII xa1-xff 中文 x80-xff 中文 2. UTF-8 (Unicode) u4e00-u9fa5 (中文) x3130-x318F (韩文) xAC00-...
  • 如何生成UTF-16汉字编码

    千次阅读 2016-07-09 20:01:46
    听见汉字编码表,是不是觉得很高大上的样子,好像不是我们一般屌丝能玩得转的东西。其实,我们也不需要去制定标准,只是从系统中获取出来,这却是一件很容易的事情。下面我来分步骤说说,看完这篇文章,你就会说这...
  • 汉字编码标准

    千次阅读 2009-03-14 11:23:00
    汉字编码标准 GB2312范围: 0xA1A1 - 0xFEFE汉字范围: 0xB0A1 - 0xF7FEGBK范围: 0x8140 - 0xFEFEBIG5范围: 0xA140 - 0xF9FE, 0xA1A1 - 0xF9FE编码 第一个字节 第二个字节 第三个字节 第四个字节 GB2312 0xB0 - 0...
  • gb2312-信息交换用汉字编码字符集

    千次阅读 2014-08-08 11:05:00
    来自百度百科:...信息交换用汉字编码字符集编辑GB2312一般指信息交换用汉字编码字符集 《信息交换用汉字编码字符集》是由中国国家标准总局1980年发布,1981年5月1日开始实施的一套
  • 汉字编码规则

    千次阅读 2008-02-14 14:46:00
    汉字编码规则(1980年)一共收录了7445个字符包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0(176)-F7(247),低字节从A1(161)-FE(254),占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE
  • 汉字编码问题(附编码察看器)

    千次阅读 2012-04-01 10:32:07
    技术组 >> 课堂探索   快典网->汉字编码查询 ...汉字编码问题(附编码察看器) 发布:卢华 日期:2007-9-11   <!-- --> 汉字编码问题 一、GB2312-8
  • GB2312汉字编码实现

    千次阅读 2014-03-15 14:20:16
    问题描述: 在很多软件中,输入拼音的首写字母就可以快速定位到... GB2312汉字编码方式中,一级汉字的3755个是按照拼音顺序排列的。我们可以利用这个特征,对常用汉字求拼音首字母。  GB2312编码方案对每个汉字采用
  • Unicode汉字编码

    万次阅读 2018-07-19 11:33:24
    转载:http://www.cnblogs.com/whiteyun/archive/2010/07/06/1772218.html
  • 汉字编码,GB2312、GB 13000、GBK、GB18030 介绍 GB 13000、GB 18030 和 Unicode 之间的比较 Unicode 标准万国码相关介绍 汉字区位码 介绍

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 147,336
精华内容 58,934
关键字:

汉字编码