博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt中文乱码解决思路
阅读量:5323 次
发布时间:2019-06-14

本文共 2381 字,大约阅读时间需要 7 分钟。

最近项目中遇到不少的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国际化"。

转载于:https://www.cnblogs.com/cnjy/p/6114814.html

你可能感兴趣的文章
个人作业
查看>>
下拉刷新
查看>>
linux的子进程调用exec( )系列函数
查看>>
MSChart的研究
查看>>
C# 索引器
查看>>
MySQLdb & pymsql
查看>>
zju 2744 回文字符 hdu 1544
查看>>
XmlDocument
查看>>
delphi 内嵌汇编例子
查看>>
SQL server 2012 安装SQL2012出现报错: 启用 Windows 功能 NetFx3 时出错
查看>>
【luogu P2298 Mzc和男家丁的游戏】 题解
查看>>
前端笔记-bom
查看>>
MATLAB作图方法与技巧(一)
查看>>
上海淮海中路上苹果旗舰店门口欲砸一台IMAC电脑维权
查看>>
Google透露Android Market恶意程序扫描服务
查看>>
给mysql数据库字段值拼接前缀或后缀。 concat()函数
查看>>
迷宫问题
查看>>
【FZSZ2017暑假提高组Day9】猜数游戏(number)
查看>>
泛型子类_属性类型_重写方法类型
查看>>
eclipse-将同一个文件分屏显示
查看>>