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

在这边总结一下关于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();

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

Qt 编码问题QTextCodec的更多相关文章

  1. Qt编码设置

    1.Qt Creator -> 工具 -> 选项 -> 环境 - >概要 -> 语言    Qt Creator本身界面的语言选择,与cpp文件编码无关,与可执行文件显示 ...

  2. C/C++ -- Gui编程 -- Qt库的使用 -- Qt编码问题

    1.直接使用QObject::trUtf8("中文字符串") 2.头文件<QTextCodec>QTextCodec::setCodecForTr(QTextCodec ...

  3. QT国际化 一 (lupdate/linguits/lrelease)

    QT国际化(lupdate/linguits/lrelease) 本文由乌合之众瞎写http://www.cnblogs.com/oloroso/ qt国际化其实就是qt中字符串的字符集编码的设置.当 ...

  4. 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换

    一.Qt环境设置 文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.Windows环境下,Qt Creator,菜单-&g ...

  5. Qt读取ANSI格式文件——利用QTextCodec将其他编码格式转换为Unicode格式

    Qt使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec ...

  6. Qt国际化相关类(以前没见过codec->toUnicode,QTextCodec,QLocale.toString和QLocale::setDefault,QInputMethod::locale())

    QTextCodec QTextCodec为文本编码之间提供转换. Qt用Unicode 来存储,绘制和操作字符串.在很多情况下你可能希望操作不同编码的数据.例如,大部分日本文档是以Shift-JIS ...

  7. Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换

    t使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec类 ...

  8. Qt代码区字符编码转换

    在做通讯练习的时候,发现发送给小助手字符乱码,图片如下 本人Qt Creator是UTF-8,需要改成gbk,代码如下 #include<QTextCodec> // 提供字符编码转换 Q ...

  9. QT直接支持GB18030,附它对此编码的一堆相关文档描述

    http://doc.qt.io/qt-5/qtextcodec.html http://doc.qt.io/qt-5/codec-gbk.html

随机推荐

  1. 编程之美 最长递增子序列 LIS

    1. O(N*logN) 解法 先对序列排序, 然后寻找两个序列的最长公共子序列 2. O(N*N) 的动态规划解法 令 LIST[i] 表示以 i 为结尾的最长子序列的长度, 那么 LIST[J] ...

  2. __file__

    __file__ 是 python 的内置变量它的值等于文件名本身 [root@localhost ~]$ cat test.py #!/usr/bin/env python print(__file ...

  3. Javascript实现图片的预加载的完整实现

    图片预加载是web开发中一种应用相当广泛的技术,比如我们在做图片翻转显示等特效的时候,为了让图片在转换的时候不出现等待,我们最好是先让图片下载到本地,然后在继续执行后续的操作.今天我们将来实现一个完整 ...

  4. c#基础 第六讲

    烧开水 先询问:“是否要烧开水(Y/N)” 是的话执行--0°--100°(30°---水温了,50°---水热了,80°---水快开了,100°---水已经开了, 结束.) 判断 循环 选择 跳转 ...

  5. Spring + MyBatis中常用的数据库连接池配置总结

    Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0.可以在Spring配置文件中利用这两者中任何一个配置数据源. DBCP数据源 DBCP类包位于  ...

  6. Python目录整合

    一.python基础篇 二.网络编程篇&&并发编程篇 三.数据库篇 -mysql -redis -mongodb 四.前端篇 -html -css -js jquery&&am ...

  7. 记录一次gitlab->github企业版的迁移

    cd到你想要存放新的工程的文件夹内, 1.使用git clone --mirror命令制作旧git的镜像 $ git clone --mirror git@git.aaaa.com:mario/my- ...

  8. PHP Ajax跨域解决

    PHP Ajax 跨域问题最佳解决方案 本文通过设置Access-Control-Allow-Origin来实现跨域. 例如:客户端的域名是client.runoob.com,而请求的域名是serve ...

  9. 网络编程 - 1.简单的套接字通信/2.加上通信循环/3.bug修复/4.加上链接循环/5.模拟ssh远程执行命令

    1.简单的套接字通信 服务端 ''' 服务端 接电话 客户端 打电话 1.先启动服务端 2.服务端有两种套接字 1.phone 用来干接收链接的 2.conn 用来干收发消息的 ''' import ...

  10. Xception

    Xception(Deep Learning with Depth-wise Separable convolutions)——google Inception-V3 Xception 并不是真正意义 ...