多元网站建设,网站营销推广,wordpress系统怎么样,网站建设 风险问题描述
在敲陆文周的书《QT5开发及实例》的示例代码时#xff0c;出现乱码#xff0c;如下图所示 具体代码如下
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);ui-treeWidget-clear();int groupSize 2;int ite…问题描述
在敲陆文周的书《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 i1;igroupSize;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 j1;jitemSize;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大佬急支糖浆的文章后理解了 源文件码字符集执行字符集等概念。
源文件编码字符集源文件保存时的编码方式如gbkutf-8等。执行字符集编译器编译后的可执行文件的编码方式。 本人采用的源文件编码字符集为UTF-8 BOM编译器为msvc2019由于源文件编码字符集带BOM因此msvc的执行字符集会变为local编码即GBK系统为中文系统。到这里一切都是正常的。 罪魁祸首因为QT中的QString在初始化时会使用QString::fromUTF8将UTF-8编码转为UTF-16编码由于执行编码为gbk这里使用fromUTF8是错误的这便是乱码的原因所在下图可证明我的观点 可以看到使用cout打印出字符串是正确的因为它不需要像QString那样使用fromUTF8函数进行转码。
解决方案
换成mingw编译器这样无论源文件编码字符集是否带BOMmingw都会采用utf8作为执行字符集这样QString使用fromUTF8函数就能转码成功。继续使用msvc编译器但需要加上预编译指令指示编译器采用utf-8作为执行字符集#pragma execution_character_set(utf-8)继续使用msvc编译器但是将文件编码方式设置为不带BOM这样fromUTF8也能正确转码。 指示QString使用locale编码来进行转码但这种方式在高版本的qt中貌似已经失效 QTextCodec *codec QTextCodec::codecForName(utf-8);QTextCodec::setCodecForLocale(codec);QTextCodec::setCodecForCStrings(codec);QTextCodec::setCodecForTr(codec);推荐采用第二种方案解决。