• Qt 编码问题QTextCodec


    在学习计算机语言的时候, 关于字体编码问题, 一直是大家开始学习新语言比较头痛的问题,

    在这边总结一下关于Qt图形框架开发的编码问题。

      一般在Window开发环境里,是GBK编码,在Linux开发环境里,是utf-8编码,关于编码的定义, 我就不这里多说了,网上有一大堆资料可以查看。

       qt对默认的是unicode编码,在Window开发环境里,比较通用的写法是: 在main.cpp文件中加入:

      

        1. QTextCodec *gbk = QTextCodec::codecForName("gb18030"); 

        2. QTextCodec::setCodecForTr(gbk);
        3. QTextCodec::setCodecForLocale(gbk);
        4. QTextCodec::setCodecForCStrings(gbk);

    第一行:定义gb18030编码格式

    第二行: 这个函数的作用是设置传给tr函数时的默认字符串编码,GUI设计中最常用的一种。

    第三行:这个函数主要用于设置和对本地文件系统读写时候的默认编码格式。比如通过流读取一个文件内容时的编码格式。或者通过qDebug()输出打印信息时的编码。

    第四行:这个函数主要是用在字符常量或者QByteArray构造QString对象时使用的一种编码方式。

    同理,在Linux开发环境里, 通用的写法是:


        QTextCodec *utg8 = QTextCodec::codecForName("utf-8");

        QTextCodec::setCodecForTr(utg8 );
        QTextCodec::setCodecForLocale(utg8 );
        QTextCodec::setCodecForCStrings(utg8 );

    一般我们做GUI设计的时候, 用到最多的也就是setCodecForTr()这个函数了,其他可以根据自己所用到的区域在设置,不过,为了通用编码,以便忘记了编码格式而弄的自己头痛, 建议还是把这三个统一设置一下吧,尽量避免中文乱码出现的概率。

    下面讲一下关于编码转换问题

    QT中的QString内容使用Unicode作为文本编码。但是实际系统中通常采用的是其他编码,例如GBK,utf8等。为了便于兼容这些格式,QT中还设置了两个字符串类型:

    QCString类: C类型字符串,必须以0结尾,也就是中间不能含有0. 例如GBK编码的字符串

    QByteArray类: 中间可以含有0.例如utf8编码的字符串

    在设置下面的代码基础上:

         QTextCodec *gbk = QTextCodec::codecForName("gb18030"); 

        QTextCodec *utg8 = QTextCodec::codecForName("utf-8");

         QTextCodec::setCodecForTr(gbk);
         QTextCodec::setCodecForLocale(gbk);
         QTextCodec::setCodecForCStrings(gbk);

    1. UTF-8 转换 GBK

    QString U2G(QString utfStr)

    {

           return gbk->toUnicode(utfStr.toLocal8Bit());

    }

    2 GBK 转换 UTF-8

    QString U2G(QString gbkStr)

    {

           return utg8->toUnicode(gbkStr.toUtf8());

    }

    -----------------------------------------------------------------------------------

        QTextCodec *gbk = QTextCodec::codecForName("gb18030");
        QTextCodec *utf8 = QTextCodec::codecForName("utf-8");

        QTextCodec::setCodecForTr(gbk);
        QTextCodec::setCodecForLocale(gbk);
        QTextCodec::setCodecForCStrings(gbk);


        QFile file("../test.txt");
        file.open(QIODevice::ReadOnly);
        QByteArray readByte = file.readAll();
        QString readStr = utf8->toUnicode(readByte.data());
        file.close();
        QString utfStr = QObject::trUtf8(readByte);    //utf-8
        QString gbkStr = QObject::tr("中文");          // gbk


        QString utf2gbk = gbk->toUnicode(readStr.toLocal8Bit());             // utf8 conver  gbk
        QString gbk2utf1 = utf8->toUnicode(utf2gbk.toUtf8());                 // gbk  convert utf8
        QString g2u = gbk->toUnicode(gbk->fromUnicode(readStr));            // gbk  convert utf8


        qDebug() << "gbk:" << gbkStr;
        qDebug() << "utf8:" << utfStr;
        qDebug() << "readStr:" << readStr;

        qDebug() << "read_size:" << readByte.length();
        qDebug() << "utf2gbk:" <<utf2gbk << "length:" << readStr.toLocal8Bit().length();
        qDebug() << "gbk2utf8-1:" << gbk2utf1 << " length: " << utf2gbk.toUtf8().length();
        qDebug() << "g2u" << g2u << "length:" << gbk->fromUnicode(utfStr).length();


        QLabel *label = new QLabel(utf2gbk);
        label->show();

    --------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    VC项目配置基础 (VC6.0 和VC2005)
    使用VC2005编译静态应用程序的方法
    静态库中使用MFC编译出现错误,共享DLL使用则正常的解决方案
    从来没有天才 靠自己创造未来——Leo鉴书(29)
    __super in MFC
    c:forEach传递参数(jsp)
    :first选择器(jQuery)
    prev ~ siblings选择器(jQuery)
    windbg 基础命令实战
    查看Linux版本系统信息方法汇总
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/6371147.html
Copyright © 2020-2023  润新知