Qt5.2和VS2012中文乱码的问题

三世 2014-04-03 11:25:52

我的开发环境是qt5.2.1+VS2012
请教各位:
1、为啥我在qDebug() << "您好,朋友。333"; 输出来的结果都是:??????????333
就我目前知道,因为visual stdio对编码UTF-8支持不好。

2、以前qt4+VS2008是通过下面方法解决

QTextCodec *codec = QTextCodec::codecForName("gbk");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);


3、现在Qt5放弃了上面的方法,网上都建议用:
首先将VC里的源代码都保存成UTF-8格式

#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif


可是我的VS2012编译后还是出现乱码?请教各位有解决方法吗?
...全文
2522 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
忙碌不会钓鱼 2014-06-30
  • 打赏
  • 举报
回复
引用 1 楼 dbzhang800 的回复:
恩,微软太出尔反尔了,VS2008中 引入一个补丁,支持 #pragma execution_character_set VS2010 sp1 支持 #pragma execution_character_set 但 VS2012 又不支持 #pragma execution_character_set 了 --- 不过可以直接用 QStringLiteral("我是中文"),在MSVC下,相当于 QString::fromWCharArray(L"我是中文"); 避开窄字符串的可执行字符集
想问下但是为什么使用 QString::fromLocal8Bit("中文"); 在window msvc 下面使用utf-8的源码,不加设定执行字符的语句 还是能够正常的显示呢? 不是会使用本地系统的gbk编码和执行么?
dbzhang800 2014-04-17
  • 打赏
  • 举报
回复
知道这回事就行了 1. MVSC的utf8源码字符集, 需要一个BOM,这个BOM最早是windows的记事本引入的。尽管现在主流的编译器可以接受它,未来如何还是不好说。 2. MVSC的utf8执行字符集,需要一个特定的#pragma,这个MSVC自创的东西,它自身合适放弃,都不是我们可控的。 题外: QtCore的维护者Thiago Macieira现在正在对QString::fromUtf8中的这个BOM问题发愁。感兴趣的话,可以搜 [Development] utf-8 BOM and parsers
三世 2014-04-17
  • 打赏
  • 举报
回复
引用 14 楼 dbzhang800 的回复:
加到头文件也可以啊,比如你所有的cpp都包含一个 common.h 的文件,直接加它里面就行。 更好的办法是直接加到Qt的 qglobal.h 这个头文件中,在Qt5.0发布之前,我提过这个想法,而且Qt的总架构师也有这个倾向,但QtCore的维护者,出于某种考虑(可能主要是对MSVC对utf8糟糕的支持的不屑吧),没有同意。
厉害,果然在头文件加入,全局都可以不出中文乱码了。
dbzhang800 2014-04-11
  • 打赏
  • 举报
回复
加到头文件也可以啊,比如你所有的cpp都包含一个 common.h 的文件,直接加它里面就行。 更好的办法是直接加到Qt的 qglobal.h 这个头文件中,在Qt5.0发布之前,我提过这个想法,而且Qt的总架构师也有这个倾向,但QtCore的维护者,出于某种考虑(可能主要是对MSVC对utf8糟糕的支持的不屑吧),没有同意。
三世 2014-04-11
  • 打赏
  • 举报
回复
引用 5 楼 dbzhang800 的回复:
不知道唉,我只有VS2010 不过 #pragma execution_character_set 也只是MSVC的权宜之计。等到它支持C++11之时,我们将可以直接写 QString a = u8"中文"; 来获得utf8的执行字符集。 -- 话说回来,一旦主流编译器支持了C++11,QString 必定会引入char16_t 支持,即 QString a = u"中文"; 效率比utf8更高。
// 源代码编码必须是: UTF-8(BOM) #if _MSC_VER >= 1600 #pragma execution_character_set("utf-8") #endif 上述代码放在main.cpp里面,为啥只能影响当前源码。其他cpp文件并不影响,还是中文乱码。 难道需要每个.cpp文件都加上述代码???
三世 2014-04-11
  • 打赏
  • 举报
回复
引用 10 楼 rophie 的回复:
[quote=引用 7 楼 qimo601 的回复:] 好吧。多谢各位,对于我来讲每个String前面加个QString a = u8"中文"; 还是很不方便。 习惯了字符串赋值直接“”; qtcreator用gcc编译器,java中,甚至c#中字符串都是简单的“中文”。 最后,为了不改变习惯,我换了VS2013+qt5.2.1,上面还是加上#pragma execution_character_set("utf-8") 完美解决。
5.2.1有2013的?直接用Qtcreator+mingw不就好了[/quote] 你说的对,我在linux下是直接qtcreator,但是windows下还是习惯VS。
yoyowinwin 2014-04-09
  • 打赏
  • 举报
回复
你还得把 windows的 CMD控制台编码换成 utf8 的来显示.
rophie 2014-04-09
  • 打赏
  • 举报
回复
引用 7 楼 qimo601 的回复:
好吧。多谢各位,对于我来讲每个String前面加个QString a = u8"中文"; 还是很不方便。 习惯了字符串赋值直接“”; qtcreator用gcc编译器,java中,甚至c#中字符串都是简单的“中文”。 最后,为了不改变习惯,我换了VS2013+qt5.2.1,上面还是加上#pragma execution_character_set("utf-8") 完美解决。
5.2.1有2013的?直接用Qtcreator+mingw不就好了
xianqingzh 2014-04-08
  • 打赏
  • 举报
回复
第一次转化有可能是utf16的,所以要再转一次。
xianqingzh 2014-04-08
  • 打赏
  • 举报
回复
void Gbk2Utf8(const char *szSrc, QString &szDst) { QTextCodec *codec = QTextCodec::codecForName("GBK"); QString localEncoded; QByteArray data; localEncoded = codec->toUnicode( szSrc ); data = localEncoded.toUtf8(); szDst = QTextCodec::codecForName("UTF-8")->toUnicode(data);//to utf-8 qDebug()<<szDst; return; }
三世 2014-04-04
  • 打赏
  • 举报
回复
好吧。多谢各位,对于我来讲每个String前面加个QString a = u8"中文"; 还是很不方便。 习惯了字符串赋值直接“”; qtcreator用gcc编译器,java中,甚至c#中字符串都是简单的“中文”。 最后,为了不改变习惯,我换了VS2013+qt5.2.1,上面还是加上#pragma execution_character_set("utf-8") 完美解决。
liz2033 2014-04-03
  • 打赏
  • 举报
回复
qt5用这个宏可以解决乱码问题,QStringLiteral("我是中文")。
astro_lee 2014-04-03
  • 打赏
  • 举报
回复
String::fromLocal8Bit("我是中文");
dbzhang800 2014-04-03
  • 打赏
  • 举报
回复
恩,微软太出尔反尔了,VS2008中 引入一个补丁,支持 #pragma execution_character_set VS2010 sp1 支持 #pragma execution_character_set 但 VS2012 又不支持 #pragma execution_character_set 了 --- 不过可以直接用 QStringLiteral("我是中文"),在MSVC下,相当于 QString::fromWCharArray(L"我是中文"); 避开窄字符串的可执行字符集
尘中远 2014-04-03
  • 打赏
  • 举报
回复
QStringLiteral是最好的解决方法,相当于以前tr的扩展
dbzhang800 2014-04-03
  • 打赏
  • 举报
回复
不知道唉,我只有VS2010 不过 #pragma execution_character_set 也只是MSVC的权宜之计。等到它支持C++11之时,我们将可以直接写 QString a = u8"中文"; 来获得utf8的执行字符集。 -- 话说回来,一旦主流编译器支持了C++11,QString 必定会引入char16_t 支持,即 QString a = u"中文"; 效率比utf8更高。
三世 2014-04-03
  • 打赏
  • 举报
回复
引用 楼主 qimo601 的回复:
我的开发环境是qt5.2.1+VS2012 请教各位: 1、为啥我在qDebug() << "您好,朋友。333"; 输出来的结果都是:??????????333 就我目前知道,因为visual stdio对编码UTF-8支持不好。 2、以前qt4+VS2008是通过下面方法解决

QTextCodec *codec = QTextCodec::codecForName("gbk");
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
3、现在Qt5放弃了上面的方法,网上都建议用: 首先将VC里的源代码都保存成UTF-8格式

#if _MSC_VER >= 1600
       #pragma execution_character_set("utf-8")
 #endif
可是我的VS2012编译后还是出现乱码?请教各位有解决方法吗?
dbzhang800:VS2012update4能解决这个问题不?貌似微软VS2013已经解决了这个问题,可惜qt-Add-in只支持到VS2012. 谢谢。

16,243

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧