在Qt中默认解析的编码格式是UTF8格式,而在vs中提供的两种编码格式分别是Unicode和ANSI。
如下图:
大家可以在项目->属性->高级中更改字符集。其中多字节字符集对应的就是ANSI编码。
也就是这样一个原因导致了vs字符串在Qt中(例如setWindowTitle("中文"))的乱码。
下面给出解决方法:
实际上,在Qt中,QString这个类只不过是在内部维护了一个QChar*类型的变量(从std::string的内部结构推测而出,实际上可能更复杂),也正是有了这样一个指针类型的变量,我们才能够动态的改变QString存储的内容。因此,QString还给出了QString(QChar*)这样的一个构造函数。
具体操作方法如下:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
const wchar_t*buffer=L"你是一个大帅哥"; //注意当字符编码选择Unicode字符集时不用加L
int len=wcslen(buffer)*sizeof(wchar_t); //计算buffer实际占用的内存大小
QChar*pchar=new QChar[len/2+1]; //申请一块和buffer同样大的内存,预留一个结束符位置,这里len/2+1的原因是sizeof(QChar)=sizeof(wchar_t)都是两个字节
memset(pchar,0,len/2+1); //将内存全部置为0,实际上不用加这一步也行
memcpy(pchar,buffer,len); //将buffer中的数据全部拷贝到pchar中去
QString str(pchar); //构造一个QString对象
QByteArray arr=str.toUtf8(); //将str中存储的字符转变为UTF8格式
QWidet w; //创建Widget对象
w.setWindowTitle(arr); //设置标题,这里能够直接将QByteArray类型做参数的原因是QByteArray类中提供了一个类型转换函数 const char *operator const char *() const,然后利用QString(const char*)这个构造函数生成了一个匿名的QString对象
w.show(); //显示widget
delete[]pchar; //删除动态分配的内存
return a.exec(); //事件循环
}
代码截图如下:
结果如下: