一般在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】Qt编码风格、命名约定

    1.类名称以大写字母开头.函数名称以小写字母开头,并使用驼峰命名法:类名使用名词或名词短语.函数名使用动词或者动词短语: 2.常量应当大写并且尽可能在类的作用域内创建成枚举值,全局常量和宏通常是大写: ...

  2. Qt字符编码,创建中文文件

    1.代码文件本身编码: 2.Qt中用于控制读入和写出文件系统时的字符编码由QTextCodec::setCodecForLocale()所决定.一般不用设置,Qt跟系统交互时会根据系统的Locale来 ...

  3. 【QT小记】QT中QString与常用字符编码转换

    前言 记录在使用QString的过程中与常用字符编码的转换方法以及乱码的可能原因和解决方法 例子 字符串 编码方式 十六进制 林 Unicode 0x6797 GBK 0xC1D6 UTF8 0xE6 ...

  4. QT学习——Qt工具介绍,Qt助手使用,第一个Qt程序,Qt字符串和字符编码

    一.Qt主要工具介绍 1)qt助手(assistant) 2)qt构建器(qmake) 3)qt设计师(designer) 4)qt转换器(uic) 5)qt资源编译器(rcc) 6)qt元对象编译器 ...

  5. Qt中的字符编码转换:UTF8、Unicode、GBK、ASCII、16进制字符、16进制数值

    文章目录 前言 简述 ASCII GBK Unicode UTF-8 应用场景 开发环境 编码转换 16进制数值转换为16进制字符 16进制数值转化为字符串 16进制字符串转换为Unicode字符串 ...

  6. Qt程序启动画面播放(gif与swf两种动画格式)

    学习Qt有一段时间了,发现一个小问题,网上关于Qt的资料或者总结性的学习及应用文章有点少. 比如,Qt完整的API,程序运行之前的启动画面如何按理想效果播放等,每次想在项目中添加一些应用的时候,总是找 ...

  7. QTextCodec中的setCodecForTr等终于消失了 (Qt5)

    在Qt4中,国内很多新手都喜欢--不分青红皂白地使用如下3行代码 QTextCodec::setCodecForTr(...) QTextCodec::setCodecForCStrings(...) ...

  8. Qt学习笔记(持续更新)

    第一个应用程序 #include "widget.h" #include <QApplication> #include<QLabel> int main( ...

  9. qt mysql乱码_Qt连接mysql 并且 解决中文乱码问题

    课题需要做一个数据展示程序, 我就想到了Qt, 连接mysql的过程中是挺简单的, 但是还是有两个坑... 一号坑: Qt 和 mysql 位数要相同!!! 我的就是不相同, 卸了mysql重装的. ...

最新文章

  1. 宏使用 Tricks
  2. SAP WM中阶Storage Type的Capacity Check – Check based on maximum quantity per bin in storage type.
  3. stlink 升级固件以后失败_介绍几种ST-Link差异 固件升级的方法和应用
  4. Nginx+Redis+Ehcache:大型高并发与高可用的三层缓存架构总结
  5. 解决:MIUI 8应用商店下载不了软件 APP
  6. 用JavaScript实现动态省市县三级联动
  7. html(1)基本组成
  8. aspx是什么语言_什么是网页
  9. 论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成
  10. java正则匹配非html字符串_java正则表达式去除html中所有的标签和特殊HTML字符(以开头的)...
  11. zkcli远程连接_高级框架第一天RPC:远程过程调用
  12. php 和bootstrap,bootstrap4和bootstrap3的区别是什么
  13. php error file_get_contents()
  14. cryptapi双向认证_2019 08 28 netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》...
  15. 小程序 图片加载慢卡
  16. 运筹优化算法工程师面试汇总
  17. Spring框架学习(十)SSM框架整合
  18. Excel表格自动填充、批量提取与组合数据
  19. 解决华为手机USB调试app闪退重启界面清空log日志问题
  20. 二进制编码及浮点数表示

热门文章

  1. ubuntu18.04安装mysql8
  2. Spring Cloud Gateway Predicate.Path过滤分析
  3. C++学习笔记之对文件的操作2
  4. python shelve模块
  5. 条件、循环、函数定义 练习
  6. Lydsy2017年4月月赛 抵制克苏恩
  7. SQLite For .Net 已经整合了32位和64位
  8. 一个DataGridView辅助类
  9. 如何将每一条记录放入到对应的范围中
  10. XML Schema ---complexType-----复合元素