QT中文乱码总结

在写一个非常简单的QT源程序时遇到了中文乱码问题,所以上网搜索得到了还算比较满意的答案。

From: http://www.ctogo.net/313.html

WOWCode的主体部分基本已经完成了,对于我自己来说,其实已经足以应付我的需要了,不过如果发布的话,实在还是拿不出手,因为很多地方还需要完善,一些对我自己来说多余的功能也没有完成,今天尝试将程序移植到了另一台机子上,却出现了中文乱码问题,记录之。

也许你在用这个方法实现中文化,但它确实不够严谨
Laguage» C++ Title» 出现频率最高的办法
  1. #include <QTextCodec>  
  2. int main(int argc, char *argv[]) 
  3. {  
  4.            QApplication app(argc, argv);  
  5.            //设置中文开始
  6.            QTextCodec::setCodecForTr(QTextCodec::codecForName(“gb18030″)); 
  7.            //设置中文结束
  8.            return app.exec();  
  9. }  


很多地方都会告诉你,这样可以实现QT支持中文,包括我看的教程书上也是,他甚至告诉我要支持中文必须加入这段代码,但我想告诉你,这个办法是有问题的,而且这个问题还不小!我在两台同样是XP系统的机子上移植就出现了中文乱码问题,而且所有中文都是用了tr()的。所以请别迷信那些教程,实践才是真理!

你可以尝试这个方法
Laguage» C++ Title»
  1. #include <QTextCodec>  
  2. int main(int argc, char *argv[]) 
  3. {  
  4.            QApplication app(argc, argv);  
  5.            //设置中文开始
  6.            QTextCodec *codec = QTextCodec::codecForName(“GB2312″);  
  7.            QTextCodec::setCodecForLocale(codec);  
  8.            QTextCodec::setCodecForCStrings(codec);  
  9.            QTextCodec::setCodecForTr(codec);  
  10.            //设置中文结束
  11.            return app.exec();  
  12. }  

虽然这个方法看似更为严谨,你可以尝试,不过这么写还是会有问题,至少没有解决我的问题。这也是我网上看到的出现频率也挺高的方法,不过我想说的是:其实这个办法治标不治本,因为它后面只是对拓宽对中文支持的范围,而一般我们都建议把中文写在tr(“”)里。

推荐个比较保险的办法
Laguage» C++ Title» 我推荐的方法
  1. int main(int argc, char *argv[]) 
  2. {
  3.     QApplication a(argc, argv);
  4.     QTextCodec *codec = QTextCodec::codecForName(“System”);    //获取系统编码
  5.     QTextCodec::setCodecForLocale(codec);
  6.     QTextCodec::setCodecForCStrings(codec);
  7.     QTextCodec::setCodecForTr(codec);
  8.     return a.exec();
  9. }

这里获取了系统字体编码,解决了我的问题,个人也觉得这个办法应该是个不错的解决方案。

也可能是字体选择不当造成的乱码

如果你始终解决不了乱码问题,可以尝试设置下字体,但其实是否是字体造成的乱码的方法很简单,如果出现的是一个个方块,便是字体设置不当,否则,优先考虑编码设置。

=============================================

下面看看我自己的总结吧,首先是源程序(目录:a, 源代码:a.cpp)

// a.cpp
#include <QApplication>
#include <QLabel>
#include <QTextCodec>

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);

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

	QLabel label("Come on,你好吗?");
	label.show();

	return app.exec();
}
代码中的关键是: QTextCodec::codecForName("GBK");

1. 通过这种方式来设置编码格式,要保证源程序文件的编码格式就是GBK(即ANSI格式(Linux上显示为ISO-8859格式)),如果你把源程序文件编码方式改为UTF8,那么编译后就会出现乱码了。

2. 如果你的源程序文件编码是UTF8,那就要将上面的GBK改为UTF8。这样才能保证不出现乱码。

在保证了上面两个条件后,将a.cpp拿到windows上或linux上编译后得到的程序都不会出现乱码现象。


example2,将上面的源程序改为:

// a.cpp
#include <QApplication>
#include <QLabel>
#include <QTextCodec>

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);

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

	QLabel label("Come on,你好吗?");
	label.show();

	return app.exec();
}
1.  QTextCodec::codecForName("System"); // 取系统的编码,在windows上会得到中文编码,在linux上默认是UTF8,与系统设置有关。

2.  对于这样的代码,在windows上要将源程序文件编码改为ANSI格式,在linux上要改为UTF8格式,否则就会出现乱码。不信可以试试。


对于以上两个例子,要说明的就是这些。

最后,再来一个结论:我发现QT编译后的可执行程序可以适应当前不同的编码格式。即编译好之后,不管你当前是以GBK或UTF8格式查看,都不会出现乱码。这是QT程序与普通的C/C++程序的区别。




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值