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();
--------------------------------------------------------------------------------------------------------------
Qt 编码问题QTextCodec的更多相关文章
- Qt编码设置
1.Qt Creator -> 工具 -> 选项 -> 环境 - >概要 -> 语言 Qt Creator本身界面的语言选择,与cpp文件编码无关,与可执行文件显示 ...
- C/C++ -- Gui编程 -- Qt库的使用 -- Qt编码问题
1.直接使用QObject::trUtf8("中文字符串") 2.头文件<QTextCodec>QTextCodec::setCodecForTr(QTextCodec ...
- QT国际化 一 (lupdate/linguits/lrelease)
QT国际化(lupdate/linguits/lrelease) 本文由乌合之众瞎写http://www.cnblogs.com/oloroso/ qt国际化其实就是qt中字符串的字符集编码的设置.当 ...
- 解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)——ubuntu环境设置默认是utf-8,文件编码可使用Encodersoft批量转换
一.Qt环境设置 文件从window上传到Ubuntu后会显示乱码,原因是因为ubuntu环境设置默认是utf-8,Windows默认都是GBK.Windows环境下,Qt Creator,菜单-&g ...
- Qt读取ANSI格式文件——利用QTextCodec将其他编码格式转换为Unicode格式
Qt使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec ...
- Qt国际化相关类(以前没见过codec->toUnicode,QTextCodec,QLocale.toString和QLocale::setDefault,QInputMethod::locale())
QTextCodec QTextCodec为文本编码之间提供转换. Qt用Unicode 来存储,绘制和操作字符串.在很多情况下你可能希望操作不同编码的数据.例如,大部分日本文档是以Shift-JIS ...
- Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换
t使用Unicode来表示字符串.但是通常需要访问一些非Unicode格式的字符串,例如打开一个GBK编码的中文文本文件,甚至一些非Unicode编码的日文,俄文等. Qt提供了QTextCodec类 ...
- Qt代码区字符编码转换
在做通讯练习的时候,发现发送给小助手字符乱码,图片如下 本人Qt Creator是UTF-8,需要改成gbk,代码如下 #include<QTextCodec> // 提供字符编码转换 Q ...
- QT直接支持GB18030,附它对此编码的一堆相关文档描述
http://doc.qt.io/qt-5/qtextcodec.html http://doc.qt.io/qt-5/codec-gbk.html
随机推荐
- VS2008 AddIn 操作DTE2
在VS2008扩展开发中,最重要的就是DTE对象.DTE对象提供了对扩展性模型中其他对象的访问.DTE是VS自动化模型中的顶级对象. 在按照http://www.cnblogs.com/yjf512/ ...
- log4j2设置日志文件读写权限(filePermissions)
spring-boot使用log4j2作为日志插件的时候需要设置日志文件的读写权限,可以File 上增加filePermissions,如: <File name="File" ...
- 这些孩子在 Ubuntu 的 Linux 终端下玩耍
导读 我发现了一个孩子们在他们的计算机教室里玩得很开心的视频.我不知道他们在哪里,但我猜测是在印度尼西亚或者马来西亚.视频请自行搭梯子: https://youtu.be/z8taQPomp0Y 在L ...
- 【BZOJ2565】最长双回文串 Manacher
[BZOJ2565]最长双回文串 Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为 ...
- 苹果微信浏览器不能post方式提交数据问题
form表单中采用post方式提交数据时,在苹果的微信浏览器中无法传递,安卓的可以 如图: 在controller中获取该数据为 null 将表单的提交方式修改为get就能够获取到 现在采用Ajax方 ...
- html 标签转译反转译
如果要在 html 标签内原样插入带 html 标签的文字,通常都会被自动解析掉,比如: document.getElementsByTagName('div')[0].innerHTML=" ...
- 苏宁易购Android架构演进史
互联网后端架构 https://mp.weixin.qq.com/s/5lDXjMh6ghQNi4E7qQIEEg 互联网后端架构 10月9日 摘要 移动青铜时代(2012-2014) 时代特点: 移 ...
- [报错] Xcode Error-Could not insert new outlet connection: Could not find any information for the class named "xxx"
当从StoryBoard或xib中需要将控件绑定类文件时(OC中是.m文件,Swift中是.swift文件) 当按住control键将控件往类文件中拖拽后,填写控件的name后,点击connect时 ...
- jumpserver(0.3.2版本)开源跳板机系统部署
1. 介绍 JumpServer亮点: 集成Ansible,批量执行命令: 支持WebTerminal wiki地址:https://github.com/jumpserver/jumpserver/ ...
- Zookeeper简介及使用
一.Zookeeper简介 1.zookeeper简介 动物管理员 Apache ZooKeeper致力于开发和维护开源服务器,实现高度可靠的分布式协调. 2.什么是ZooKeeper? ZooKee ...