本文介绍: 在敲陆文周的书《QT5开发及实例》的示例代码时,出现乱码,如下图所示具体代码如下。
问题描述
在敲陆文周的书《QT5开发及实例》的示例代码时,出现乱码,如下图所示
具体代码如下
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->treeWidget->clear();
int groupSize = 2;
int itemSize = 4;
for(int i=1;i<=groupSize;i++){
QTreeWidgetItem *group = new QTreeWidgetItem(ui->treeWidget);
group->setText(0,QString("小组")+QString::number(i));
group->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
group->setCheckState(0,Qt::Unchecked);
for(int j=1;j<=itemSize;j++){
QTreeWidgetItem *subItem = new QTreeWidgetItem(group);
subItem->setText(0,QString("项目")+QString::number(i)+QString::number(j));
subItem->setFlags(Qt::ItemIsUserCheckable|Qt::ItemIsEnabled|Qt::ItemIsSelectable);
subItem->setCheckState(0,Qt::Unchecked);
}
}
}
原因分析
在阅读csdn大佬急支糖浆的文章后,理解了 源文件码字符集,执行字符集等概念。
- 源文件编码字符集:源文件保存时的编码方式,如gbk,utf-8等。
- 执行字符集:编译器编译后的可执行文件的编码方式。
本人采用的源文件编码字符集为UTF-8 BOM,编译器为msvc2019,由于源文件编码字符集带BOM,因此,msvc的执行字符集会变为local编码,即GBK(系统为中文系统)。到这里,一切都是正常的。
罪魁祸首:因为QT中的QString在初始化时会使用QString::fromUTF8将UTF-8编码转为UTF-16编码,由于执行编码为gbk,这里使用fromUTF8是错误的,这便是乱码的原因所在,下图可证明我的观点:
可以看到,使用cout打印出字符串是正确的,因为它不需要像QString那样使用fromUTF8函数进行转码。
解决方案
- 换成mingw编译器,这样无论源文件编码字符集是否带BOM,mingw都会采用utf8作为执行字符集,这样QString使用fromUTF8函数就能转码成功。
- 继续使用msvc编译器,但需要加上预编译指令指示编译器采用utf-8作为执行字符集
#pragma execution_character_set("utf-8")
- 继续使用msvc编译器,但是将文件编码方式设置为不带BOM,这样fromUTF8也能正确转码,但可能出现其它问题,如一些中文的标点字符是必须带BOM的,会让编译器无法识别而报错,因此不推荐该方法。
- 指示QString使用locale编码来进行转码,但这种方式在高版本的qt中貌似已经失效
QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
推荐采用第二种方案解决。
原文地址:https://blog.csdn.net/weixin_49389765/article/details/135721931
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_60546.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。