最近项目中遇到不少的Qt中文乱码的问题,主要原因是客户的需求比较多,Qt版本有用4的版本的也有用5的版本,并且还有windows与linux跨平台的需求。
经常出现个问题是windows的解决了,源代码放到linux上编译不通过或者中文会乱码,本文主要是得出一个解决方案能解决Qt的中文问题,并支持不同平台与不同版本。
下面我们通过下列场景中的问题来找寻答案:场景1:
Qt版本:      Qt5.1.0_VS2012
操作系统:     win7
CPP文件编码:  UTF8—无BOM格式
CPP部分代码如下:QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;
试着编译下你会发现编译出错:error C2001: newline in constant
为什么呢?因为UTF8分为UTF8-无BOM和UTF8-BOM
UTF8-BOM其实就是比UTF8-无BOM多了几个字节的文件头,用于和UTF-16与UTF-32区分的。而:windows识别的UTF8是指UTF-BOM(你可以使用记事本另存为UTF8格式后查看)。
因为有中文冒号:的存在故此UTF8-无BOM文件格式使用VS的Cl编译器是无法识别为UTF8的格式,只能当成ANSI来读取解析编译,故编译出错。
那就有人会说那我就把CPP的文件格式改为:UTF8—BOM格式。好,我们来看下个场景
场景2:
CPP文件编码:  UTF8—BOM格式
CPP部分代码如下:QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;
编译通过,运行你会发现出现了一个问题,那就是中文乱码了,输出了一堆无用的信息。
这又是什么问题呢?
其实是QT的QTextCodec::codecForName("UTF8")这句代码导致的。注:QT认为的UTF8默认为:UTF8-无BOM。
故就成了把UTF8-BOM格式的CPP文件认为是UTF8-无BOM格式去解析,那结果显而易见肯定会出错。
场景3:
CPP文件编码:  UTF8—BOM格式
CPP部分代码如下:// QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8")); 删掉此行
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;or
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); // 改为GBK编码
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;
编译通过,并且输出的中文也是正确无乱码。
场景4:
CPP文件编码:  GBK编码
CPP部分代码如下:// QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8")); 删掉此行
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;or
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); // 改为GBK编码
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;
编译通过,并且输出的中文也是正确无乱码。
总结:
(1)、中文编码一律使用QString::fromLocal8Bit()接口。
原因:需要支持QT4版本。QStringLiteral()方法也可取,但是它只支持QT5版本,如果没有版本问题,可以使用。
(2)、CPP等文件编码一律使用UTF8—BOM格式。
原因1:UTF8-无BOM在使用window编译器cl中编译会失败,当然除非你Windows中使用QT的Mingw版本编译开发。
原因2:不使用GBK的文件编码是为了更容易的兼容到linux版本与windows中,否则你需要改QtCreate的编码环境与linux的系统字符环境。
 

其它知识:QString str( QObject::tr("中文") ) 能用么?

答案:不能,tr( ) 中只能是英文。

因为QT5版本取消了QTextCodec::setCodecForTr()方法。并且你要明白QObject::tr是干嘛的。它是用于程序国际化使用的,也就可以界面文字翻译成不同的语言。你如果使用QObject::tr,你应该全部用英文表示,然后后面借助Linguist翻译成中文,就不会乱码了。详细请搜索“qt国际化"。

Qt中文乱码解决思路相关推荐

  1. QT中文乱码解决思路和方法汇总

    QT中文乱码解决思路和方法 中文编码一律使用QString::fromLocal8Bit()接口,原因是为了支持QT4版本.QStringLiteral()方法也可以使用,它是支持QT5版本的: CP ...

  2. QT中文乱码解决方法2

    转载自:http://blog.163.com/seven_7_one/blog/static/162606412201032955449489/ QT中文乱码的解 2010-04-29 17:54: ...

  3. Qt中文乱码解决办法

    目录 一.解决方法: 1. QT4版本 2. QT5版本 二.QString 为什么会乱码呢 三.tr的使用 一.解决方法: 1. QT4版本 中文乱码解决办法是在main.cpp文件加入: #inc ...

  4. java在Socket传输中文乱码解决思路及代码

    中文乱码产生的原因就是从GBK转到UTF-8,或者是不同的编码格式来回转,导致byte[]中存放的字节丢失. 思路是:在客户端进行传输前,将需要传输的字节,以一个编码方式进行传输,假设设置GBK,之后 ...

  5. confluence中文乱码解决思路和方法

    首先明确一个东西,如果confluence写得文章保存以后出现乱码,那么只有三种可能: 文件系统编码不正确.不支持中文(上传的附件中有中文,预览出现乱码,大部分是这个原因) 数据库编码不正确(大部分是 ...

  6. 【总结】Qt+Mysql5.5中文乱码解决

    前段时间开发数据库几个模块一直预留着一个数据库内和程序界面上中文乱码的问题未解决,以前做asp.net.JSP,J2EE.C#时候知道,数据库中文乱码一般都是编码问题导致的,问题不大,只需要数据库客户 ...

  7. 【转】QT中使用MYSQL中文乱码解决方法

    [转]QT中使用MYSQL中文乱码解决方法 Linux下乱码解决办法: 1.在QT程序的main.cpp的main函数中添加红色字那三句: int main(int argc, char *argv[ ...

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

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

  9. 彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

    尊重作者,支持原创,如需转载,请附上原地址:https://blog.csdn.net/libaineu2004/article/details/19245205 一.Qt Creator环境设置 1 ...

最新文章

  1. 软件篇:程序员如何提升自己的技能
  2. Oracle系统表查询
  3. jquery动态生成SKU表格
  4. php语+言教程,【杂谈】php言语入门教程(PHP编程进修路线图)
  5. 越不服务器显示异常什么原因,计算机异常问题都有哪些常见类型
  6. dfs遍历和bfs遍历python_广度优先遍历(BFS)和深度优先遍历(DFS)
  7. 专家系列教程:遭受***后的证据有哪些?
  8. php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
  9. mysql cmmand not found
  10. python的requests.session()_python3+requests接口自动化session操作方法
  11. 如何解决macbook开机密码输入正确,却提示“密码错误”无法登陆?
  12. nsis出错_cf nsis错误怎么办 nsis错误解决办法全解
  13. 二、Linux 教程-基础命令(1~180未完)
  14. java毕业设计宿舍管理系统mybatis+源码+调试部署+系统+数据库+lw
  15. Go解决报错 error obtaining VCS status: exit status 128 Use -buildvcs=false to disable VCS stamping
  16. lenovo启动热键_联想启动热键
  17. 3000字作文 小孩调皮
  18. 什么牌子的洗地机最适合家用?洗地机品牌排行榜前十名推荐
  19. android推送设置功能
  20. 中触媒科创板上市:市值74亿 为李进与刘颐静夫妻店

热门文章

  1. request获取中文乱码的问题
  2. 集合元素处理(传统方式)
  3. 基本数据类型和包装类型
  4. 天津市职高高一计算机试题及答案,职高(中职)数学(基础模块)上册题库.doc
  5. 计算机的好处英语,跪求一篇英语作文 题目:论计算机的优缺点
  6. MQTT.fx连接aliyun阿里云的方法
  7. 【Laravel-海贼王系列】第十三章,路由控制器解析
  8. 腾讯云Service Mesh生产实践及架构演进
  9. linux命令:userdel
  10. 2016网络安全***赛记录