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

在这边总结一下关于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. 部署全局ajax处理

    $.ajaxSetup({ beforeSend:function(){ $('.loading').show(); }, complete:function(){ $('.loading').fad ...

  2. Deep Learning的基本思想

    假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,形象地表 示为: I =>S1=>S2=>…..=>Sn => O,如果输出O等于输入I,即输入I ...

  3. Spring学习笔记--自动检测

    要使用自动检测,我们需要用到<context:annotation-scan>标签.<context:annotation-scan>元素除了完成与<context:an ...

  4. 移动App如何实践单点登录

    移动应用实现单点登录,分析下面两种需求: 需求一: 账号在正在设备A上使用(应用是设备A上当前活动应用),  若设备B上用该账号登录应用,要求设备A上的账号立即退出. 解决办法: 应用客户端上做个定时 ...

  5. 以打字形式展示placeholder的插件

    http://weber.pub/以打字形式展示placeholder的插件/197.html

  6. Date 日期格式化

    <span id="time"></span> <script> //名称:日期加法函数 //参数:part(year.month.day.ho ...

  7. absolute float 比较分析

    同一:absolute-float 都脱离了文档流,也就是默认情况下,父盒子计算高度不包括 absolute/float 的元素 下例: 两个 parentDiv,背景色:深海蓝;边框:1px红色实线 ...

  8. 学习ASP.NET MVC3(6)----- Filte

    前言 在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MVC(特指:Asp.Net MVC,以下皆同)项目中不想让MVC开发人员去关心和写类似身份验证,日志,异常,行为截取等这部分重复的代码 ...

  9. CH5402 选课【树形DP】【背包】

    5402 选课 0x50「动态规划」例题 描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N≤300) 门的选修课程,每个学生可选课程的数量 M 是 ...

  10. Dealing with a Stream-based Transport 处理一个基于流的传输 粘包 即使关闭nagle算法,也不能解决粘包问题

    即使关闭nagle算法,也不能解决粘包问题 https://waylau.com/netty-4-user-guide/Getting%20Started/Dealing%20with%20a%20S ...