网站首页 > 博客文章 正文
最近项目中遇到不少的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国际化"。
猜你喜欢
- 2024-09-08 Qt 贪吃蛇制作(含源码)(qt编写贪吃蛇)
- 2024-09-08 qt 提示“启动程序失败,路径或者权限错误?”解决方法
- 2024-09-08 电脑文件不小心删除了怎么办?两个方法教你秒恢复
- 2024-09-08 Qt——内存回收(qti内存)
- 2024-09-08 C++跨平台库QT学习 操作Excel(跨平台c++开发工具)
- 2024-09-08 Qt 工程 pro文件(qt工程文件.pro在哪儿找)
- 2024-09-08 Qt中的快捷键汇总(qtcreator快捷键)
- 2024-09-08 Qt5+VS2015编程实例:下拉列表框QComboBox控件使用
- 2024-09-08 Qt编程进阶(87):基于HTTP协议的网络文件下载
- 2024-09-08 第5篇 基础(五)Qt布局管理器(qt常用的布局管理器)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)