最近项目中遇到不少的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 中文乱码解决大全

    源地址:http://blog.csdn.net/xcy2011sky/article/details/7168376 解决中文乱码,最好知道乱码是什么格式比如说:utf-8. 解决方案: 1.让整个 ...

  2. QT中文乱码解决方法

    由于我毕设的界面是用Qt做的,之前没怎么接触过Qt,所以实现过程中遇到不少小问题,头一个就是这个. 现如今宝宝将其记录下来,供同样有需要的同学或者自己以后方便查阅. 1.所有文件编码格式须一致 不统一 ...

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

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

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

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

  5. Qt中文乱码问题(比较清楚,同一个二进制串被解释成不同的语言)

    文章来源:http://blog.csdn.net/brave_heart_lxl/article/details/7186631 以下是dbzhang关于qt中文乱码问题原因的阐述,觉得不错: 首先 ...

  6. JSP中Get提交方式的中文乱码解决

    最近对JSP&Servlert的原理很感兴趣,所以今天花时间看了一下:无奈在一个编码问题上困扰很久 这是我的解决思路: (1)检查网页(html/jsp)页面的编码: (2)检查服务器端的处理 ...

  7. java中文乱码解决之道(九)-----总结

    乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到 ...

  8. Javaee中文乱码解决方法

    分类: javaee2015-07-09 16:35 29人阅读 评论(0) 收藏 编辑 删除 post 中文乱码解决方式 接受数据的时候设置 request.setCharacterEncoding ...

  9. java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**

    在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...

随机推荐

  1. Yii读取TXT文件数据插入到数据库

    个人平时会用到的方法,记录一下并分享给需要的朋友,Yii批量添加还需要clone一下model才可以,不然只会插入一条数据. 也可以把文件通过参数的方式调入到方法中. // 读取CVS文件 funct ...

  2. 许愿墙的搭建(基于Apache+php+mysql)

    一.准备部分:CentOS 7  , Linux 文本   各自配置好环境 二. CentOS 7准备如下: yum install httpd -y #安装httpd yum install php ...

  3. Spring相关

    一.Spring中ApplicationContext加载机制加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet. 这两者在功能上完全等同,只是 ...

  4. checkbox的check事件

    <input type="checkbox" id="NameFlag" name="originalName" onClick=&q ...

  5. ElasticSearch配置说明

    配置文件位于%ES_HOME%/config/elasticsearch.yml文件中. cluster.name: elasticsearch 配置集群名称,默认elasticsearch node ...

  6. 关于MVC4项目从32位机移到64位机编译报错解决方案

    早上写了个MVC WEBAPI的demo 机子环境是:XP SP3+ VS2010 + ASP.NET MVC4 然后晚上拿回笔记本进行编译运行,结果报错如下: “/”应用程序中的服务器错误. 分析器 ...

  7. SQL Server系列

    这里整理了我学习SQL Server的全部文章,包括从基础到高级,做一个目录,方便以后查找. SQL Server数据类型 SQL Server中开发常用的数据类型 单表查询和多表查询 一个单表查询的 ...

  8. Msbuild项目集成右键菜单编译

    DS1.背景:   我们为什么要将VS2008命令行编译.sln文件集成到右键菜单呢? 原因一:VS2008很好很强大,但太费系统资源了,尤其是在虚拟机在里面装VS2008的时候更是如此. 原因二:有 ...

  9. background复合属性详解(上):background-image

    background复合属性是个很复杂的属性,花样非常多,比较神奇的是css3 中支持多图片背景了,这篇文章先讲讲background-image属性,其他背景属性会在后续的文章综合总结. 一.最基本 ...

  10. office2010密钥

    J33GT-XVVYK-VHBBC-VY7FB-MTQ4CGRPWH-7CDHQ-K3G3C-JH2KX-C88H86CCCX-Y93YP-3WQGT-YCKFW-QTTT76QFDX-PYH2G-P ...