Bootstrap

关于vs字符串在Qt中显示乱码的问题

 在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();            //事件循环

}

代码截图如下: 

结果如下:

;