Qt与MSVC的中文问题

0

因为之前发布了GCC编译的TwitWar,结果在有些人的xp系统下面出现Runtime Error。主要是调用插件,而这个插件又调用了其他的dll文件。。。然后一直解决不了,最后还是决定用MSVC2008编译。。还好最后结果还不错。。(但是有个同学说他没能加载插件,真悲催。。。)

如果用MSVC2008编译的话,源代码的编码格式是绝对不可以是UTF-8 without BOM的。因为该死的MSVC只认UTF-8 without BOM。。。如果你保存的编码格式是UTF-8 with BOM,那么你用Qt的时候,十有八九会乱码。。

目前我觉得最稳妥的方法是:

  1. 将源代码都保存为GBKGB2312。这样编译之后的二进制文件中的字符串就都是这个编码。
  2. 凡是源代码中有中文的字符串都用tr()括起来。。例如:tr(“测试中文”);
  3. main()函数中,一开始就设置codec
设置Codec
1
2
3
4
5
QTextCodec* codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForCStrings(codec);
codec = QTextCodec::codecForLocale();
//codec = QTextCodec::codecForName("GBK");//或GB2312
QTextCodec::setCodecForTr(codec);

这里解释一下:

  1. 按常理来说,被注释掉的codec = QTextCodec::codecForName(“GBK”);应该是能工作的。因为源代码是用GBK格式保存的。 但是实际上在xp系统下,依然会乱码,只能用codecForLocale()来解决。郁闷的是xp系统的默认编码本来就是GBK

  2. 最后一行设置了用于tr()的编码为GBK。这样,被tr()括起来的中文就会被Qt正确转换成Unicode了。

  3. 如果设置了codecForCStringUTF-8的话,那么下面的会按UTF-8来转换。QString astring = "My little World!"; 虽然因为源代码是GBK格式,My little World!会以GBK格式储存。但是由于UTF-8GBK都兼容ASCII,就是说那些ASCII字符在UTF-8GBK里面都是一样的,所以这里不会出错。。

  4. 至于为什么要将CStrings的编码设置成UTF-8?因为网络数据。网络数据一般都是UTF-8编码的,而codecForCStrings指定的是QByteArraychar*QString互换的编码。。
    例如,读取QNetworkReply中的数据:

1
2
QByteArray data = reply->readAll();
QString content = data;

因为dataUTF-8格式,所以按上面设置以后content不会乱码。

Qt

Comments