Qt QString在Vs中中文乱码

在Vs2017环境下运行

#include <QtWidgets/QApplication>
#include <Qstring>
#include <Qdebug>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

	QString str = "中文测试";
	qDebug() << str;

    return a.exec();
}

结果

"???????"

QString内部存储是默认是基于utf16,而参数默认接收的是utf-8的编码格式,而qt存储,使用QStringLiteral进行转换后就能进行正常打印,QStringLiteral是一个宏,作用是把多字节编码转换成utf-8

#include <QtWidgets/QApplication>
#include <Qstring>
#include <Qdebug>
#include <iostream>
#include <QMessageBox>
using namespace std;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

	QString str = QStringLiteral("中文测试");
	qDebug() << str;
	QMessageBox::information(0,"title",str);

    return a.exec();
}

结果
在这里插入图片描述
以上是在vs2017环境进行运行,同样的代码在qtCreate中是乱码的,于是可以在qtCreate中的 工具->选项->文本编辑器->行为 中可以看到qtCreate默认是用的utf-8进行编码的,所以以上代码去掉QStringLiteral运行
在这里插入图片描述
在windows平台下运行qtCreate还会出现显示不正常,在pro文件中加上config += console就能在控制台正常显示中文了。

在VS2017中可以直接保存编码格式为utf-8具体操作
具体操作选中一个文件比如后缀.h的文件后在 菜单栏->文件->高级保存选项 可以修改编码方式,注:vs2017默认是隐藏了该选项
在这里插入图片描述
调出高级保存方法如下:

  • 单击“工具”|“自定义”命令,弹出“自定义”对话框。
  • 单击“命令”标签,进入“命令”选项卡。
  • 在“菜单栏”下拉列表中,选择“文件”选项。
  • 单击“添加命令”按钮,弹出“添加命令”对话框。
  • 在“类别”列表中,选择“文件”选项;在“命令”列表中,选择“高级保存选项”选项。
  • 单击“确定”按钮,关闭“添加命令”对话框。
  • 选中“控件”列表中的“高级保存选项”选项,单击“上移”或者“下移”按钮,调整该命令的位置。
  • 单击“关闭”按钮,完成“高级保存选项”命令的添加操作。

选择下面的utf-8无签名的格式
在这里插入图片描述
还有一种解决方法是指定vs2017编译的编码格式,通过添加宏#pragma execution_character_set("UTF-8")

#include <QtWidgets/QApplication>
#include <Qstring>
#include <Qdebug>
#include <iostream>
#include <QMessageBox>
#pragma execution_character_set("UTF-8")

using namespace std;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

	QString str = "中文测试";
	qDebug() << str;
	QMessageBox::information(0,"title",str);

    return a.exec();
}

如果是从外部接收到的数据那么还需了解更多的中文编码解决方法

#include <QtWidgets/QApplication>
#include <Qstring>
#include <Qdebug>
#include <iostream>
#include <QMessageBox>
#include <QTextCodec>
#include <windows.h>
//#pragma execution_character_set("UTF-8")

using namespace std;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
	//源数据是GBK或者GB2312 多字节存入QString
	//本地默认编码方式GBK
	QString str = QStringLiteral("中文测试");
	qDebug() << str;

	char *src = "元数据中文GBK";//假设为接收到的数据,用QString进保存
	//QString::fromLocal8Bit是根据本地编码进行存储   现默认GBK
	QString str1 = QString::fromLocal8Bit(src);
	qDebug() << "str1 = " << str1;

	//把QString转为GBK
	//cout是以GBK进行输出的,通过toStdString方法进行输出
	cout << str1.toStdString()<<endl;//乱码,要先转换成本地编码
	cout << str1.toLocal8Bit().toStdString() << endl;//正常

	//现在默认编码是GBK,改成UTF-8
	QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
	//此时str2是utf-8,str1是GBK,因此进行toutf8转换
	QString str2 = QString::fromLocal8Bit(str1.toUtf8());
	qDebug() << "str2 = "<<str2;//乱码
	QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));//切换默认编码方式
	qDebug() << "str2 = " << str2;//正常,说明qDebug是GBK编码

	//用到windows api,但是类型不一样,L转换成宽字节
	MessageBox(0,L"内容",L"title",0);//windows的API创建窗口
	MessageBox(0, str2.toStdWString().c_str(), L"标题", 0);//toStdWString方法是转换成宽字符集

    return a.exec();
}

结果
在这里插入图片描述
在这里插入图片描述
vs2017默认是GBK编码,因此通过QStringLiteral能正确转换外,要想在cout输出要先使用toLocal8Bit()方法,除此之外还测试到qDebug是以GBK方式存储的,用windows的API调用一个窗口时把QString中文的正确显示是通过toStdWString方法中间W就是转换成宽字节。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值