以下因素都有影响:
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();
长叹一声,连最贴心的调试器都不靠谱,只有最终运行程序才靠谱,以后要千万小心。
------------------------------------------------------------------------------
我晕,又有新发现:
VS调试状态,底下左右两片区域,左边选择Watch 1窗口,右边选择Output窗口,同一个qDebug输出值,左边Watch正确,右边Output错误!
各位可以试试,把以下文字存储在utf8文件里(可以带BOM):
zsse中国最好utf8_éçàèöùïë
然后用我的代码读取后,观察Watch和Output的不同输出。
------------------------------------------------------------------------------
PS,我使用的是VS2008 SP1 TEAM 英文版 + 4.86官方版(非自编译版)