Qt乱码问题总结

作用

QTextCodec::codecForLocale 至少控制qDebug,QString::toLocal8Bit/QString::fromLocal8Bit
QTextCodec::codecForCStrings 控制QString构造函数和赋值构造函数
QTextCodec::codecForTr 控制QObject::tr()


默认值

QTextCodec::codecForLocale 默认同System 估计是GBK
QTextCodec::codecForCStrings 默认NULL 估计是ISO 8859-1
QTextCodec::codecForTr 默认NULL 估计是ISO 8859-1


空解码器

QTextCodec::codecForName("GBK")返回NULL,按照网上说法拷贝\plugins\codecs目录后仍然不起作用。
如果把NULL设置给上面的变量等同于恢复初始默认值。


源文件编码

源文件编码采用UTF-8 without BOM 时需要用
QTextCodec::codecForName("UTF-8")


源文件是ANSI时需要用
QTextCodec::codecForName("System")


VS处理UTF-8

在VS编译器中有BOM的UTF-8编码不能使用QTextCodec::codecForName("UTF-8")。因为编译器识别了,所以自动转换了编码。
其他编译器不会自动转换。


最终的解决方案

#include <QtGui/QApplication>
#include "MainWindow.h"

int main(int argc, char *argv[])
{
  QTextCodec *codec = QTextCodec::codecForName("System");

  QTextCodec::setCodecForLocale(codec);
  QTextCodec::setCodecForCStrings(codec);
  QTextCodec::setCodecForTr(codec);

  QApplication a(argc, argv);
  MainWindow w;
  w.show();
  
  return a.exec();
}

你可能感兴趣的:(qt)