• 6122阅读
  • 7回复

[公告]QT+VS编译器处理字符串时的坑真是多 [复制链接]

上一主题 下一主题
离线stlcours
 

只看楼主 倒序阅读 楼主  发表于: 2014-11-27
QT+VS编译器处理字符串时的坑真是多
以下因素都有影响:
1. QT4与QT5对字符串编码的处理不同(最好不要在源代码里直接写中文,坑更多)
2. QTextCodec自动对编码转换的影响
3. 源代码文件对编码存储格式的不同会影响编译器对字符串的理解
4. 不同版本编译器对源代码文件的理解不同,比如VC6和VC2005的不同,比如VS2010的pragma指令,更不用说MinGW与VC编译器的不同。
5. 也就是我今天碰到的,VS输出调试器对字符串编码的影响。以下代码在单步调试状态下读取utf8文件,中文正确,外文特殊字符乱码(其实也不是乱码,但是显示问号),鉴于前面QT的这么多坑,我都已经见怪不怪了。今天意外把打印值显示到界面上,全部正确!看来VS调试器输出部分(尽管用的是qDebug语句)与QT程序对字符串编码的理解也不同。


QTextStream in(&file);
in.setCodec("UTF-8"); // good,写上这个,中文环境下读取中文正确

while(!in.atEnd())
{
    QString line = in.readLine();
    qDebug() << line.toLocal8Bit(); // convert to locale multi-byte string
    strCode = line;
}
file.close();


长叹一声,连最贴心的调试器都不靠谱,只有最终运行程序才靠谱,以后要千万小心。
----------------------------------------------------------
我现在用的是VS2008+QT4.8,有没有还有别的坑,还请大家补充。
离线stlcours

只看该作者 1楼 发表于: 2014-11-27
我晕,又有新发现:
VS调试状态,底下左右两片区域,左边选择Watch 1窗口,右边选择Output窗口,同一个qDebug输出值,左边Watch正确,右边Output错误!

各位可以试试,把以下文字存储在utf8文件里(可以带BOM):
zsse中国最好utf8_éçàèöùïë

然后用我的代码读取后,观察Watch和Output的不同输出。
离线weiweiqiao

只看该作者 2楼 发表于: 2014-12-18
看来lz深受其害。。为何不用mingw版?
Jobs Insanely Great.
离线stlcours

只看该作者 3楼 发表于: 2014-12-18
因为VS开发环境好用,堪称神器。QT给VS的插件也比较好用。至于QT本身的问题,我会注意就是了,反正现在已经明白了。再说多用VS有助于自己对VC的理解。大概就这些。

虽然开发用VS,但最终发布版我看你会用MINGW编译。
离线XChinux

只看该作者 4楼 发表于: 2014-12-22
我倾向于直接用GBK编码,这样msvc和mingw/gcc能直接兼容,要处理的麻烦事少一些。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线stlcours

只看该作者 5楼 发表于: 2014-12-22
使用VS当然是GBK最好,但是为了跨平台,我不能使用GBK,这样可以避免跨平台的麻烦。另外听说以前GCC不支持带BOM的UTF8,但现在支持了。所以统一用UTF8+BOM
离线dosmlp

只看该作者 6楼 发表于: 2014-12-23
QStringLiteral你值得拥有
离线dbzhang800

只看该作者 7楼 发表于: 2014-12-23
回 dosmlp 的帖子
dosmlp:QStringLiteral你值得拥有 (2014-12-23 12:08) 

这个不是问题的关键,关键还是C++的 input-charset 和 exec-charset 两个概念。不然的话,QStringLiteral 即不能保证你得到正确的结果,也无法保证跨平台。
快速回复
限100 字节
 
上一个 下一个