在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就是转换成宽字节。