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

}

代码截图如下: 

结果如下:

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值