qt4.6移植到qt4.7出现中文乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qt4.6移植到qt4.7出现中文乱码相关的知识,希望对你有一定的参考价值。

在本地加载一个UI,在手机的界面上原来是中文的全部是小方格,或者是乱码
我试了,但是按钮上的还是小方格,在以前标准界面上的中文是可以显示,在4.7上的手机界面就变成了小方格。。。

网上搜索了3~4天,概括如下:

1、使用setDefaultCodec进行设置;

qApp->setDefaultCodec( QTextCodec::codecForName("GBK") );

QLabel *label = new QLabel( tr("中文标签") );

可惜setDefaultCodec是QT3的函数,QT4已经不支持了。

2、 设置QObject的成员函数tr()的编码;

QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

3、使用QString的fromLocal8Bit()函数;

QString str;

str = str.fromLocal8Bit("哈哈哈");

hello.setWindowTitle(str);

4、用QTextCodec的toUnicode方法来显示中文

QLabel hello(QObject::tr("你好").toLocal8Bit());

QTextCodec *codec = QTextCodec::codecForLocale();

QString a = codec->toUnicode("安师大手动");

以上各种都没有解决问题。

继续没有搜索这个问题,终于在一个blog中发现了真正的答案:字库问题。

“QT4下发现一个很奇怪的现象,就是对话框的Title“我是对话框”可以正确显示,而按钮就是小方块。总感觉是系统某些设置不对,而不是字符编码的问题,如果是字符编码问题,那么应该是乱码而不是小方块。忽然想到网上有提到过是字库的问题,觉得现象可以解释,标题栏和按钮文字不是同一种字体,而恰好按钮字体没有,所以是小方块,而不是乱码。

网上搜了下QT4用的默认字体,没有查到,又看了QT4的源代码,代码太多,也没有找到。

不过setFont函数引起了我的注意,在网上看到过这种方法。”

参考上面的内容,修改代码:

...

QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));

QFont font("Times",12,QFont::Normal,FALSE);

app.setFont(font);

...

label.setText(QObject::tr("同一个世界,同一个梦想!"));

...

成功!显示中文正常!

这个问题的解决真是太重要了,说实话真的有点疲惫,幸好没有放弃。yeah!

后记:使用qt的designer时,发现界面还是乱码。使用qtconfig设置font为Bitstream Charter后解决乱码问题。此时,我想原来的程序是不是也OK?不料一试,果然没有乱码~Oh MyGod!

Come From:http://www.linuxdiyf.com/viewarticle.php?id=97025
另外的解决方案:

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mociml/archive/2010/04/26/5531643.aspx

参考资料:http://blog.csdn.net/mociml/archive/2010/04/26/5531643.aspx

参考技术A QTextCodec* code = QTextCodec::codecForName("GB2312");
QTextCodec::setCodecForCStrings(code);
QTextCodec::setCodecForLocale(code);
QTextCodec::setCodecForTr(code);
加上这段代码试试本回答被提问者采纳

Qt中文乱码解决思路

最近项目中遇到不少的Qt中文乱码的问题,主要原因是客户的需求比较多,Qt版本有用4的版本的也有用5的版本,并且还有windows与linux跨平台的需求。
经常出现个问题是windows的解决了,源代码放到linux上编译不通过或者中文会乱码,本文主要是得出一个解决方案能解决Qt的中文问题,并支持不同平台与不同版本。
下面我们通过下列场景中的问题来找寻答案:

场景1:
Qt版本: Qt5.1.0_VS2012

操作系统: win7
CPP文件编码: UTF8—无BOM格式
CPP部分代码如下:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;

试着编译下你会发现编译出错:error C2001: newline in constant
为什么呢?
因为UTF8分为UTF8-无BOM和UTF8-BOM
UTF8-BOM其实就是比UTF8-无BOM多了几个字节的文件头,用于和UTF-16与UTF-32区分的。

而:windows识别的UTF8是指UTF-BOM(可以使用记事本另存为UTF8查看)。
因为有中文冒号:的存在故此UTF8-无BOM文件格式使用VS的Cl编译器是无法识别为UTF8的格式,只能当成ANSI来读取解析编译。
那就有人会说那我就把CPP的文件格式改为:
UTF8—BOM格式。好,我们来看下个场景


场景2:
CPP文件编码:  UTF8—BOM格式
CPP部分代码如下:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8"));
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;
编译通过,运行你会发现出现了一个问题,那就是中文乱码了,输出了一堆无用的信息。
这又是什么问题呢?
其实是QT的QTextCodec::codecForName("UTF8")这句代码导致的。

注:QT认为的UTF8默认为:UTF8-无BOM。
故就成了把UTF8-BOM格式的CPP文件认为是UTF8-无BOM格式去解析,那结果显而易见肯定会出错。



场景3:
CPP文件编码:  UTF8—BOM格式
CPP部分代码如下:

// QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8")); 删掉此行
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;

or
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); // 改为GBK编码
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;
编译通过,并且输出的中文也是正确无乱码。

场景4:
CPP文件编码:  GBK编码
CPP部分代码如下:

// QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF8")); 删掉此行
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;

or
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); // 改为GBK编码
QString strMessage = QString::fromLocal8Bit("我是UTF8编码的文件:"));
qDebug() << strMessage;
编译通过,并且输出的中文也是正确无乱码。


总结:
(1)、中文编码一律使用QString::fromLocal8Bit()接口。
原因:需要支持QT4版本。QStringLiteral()方法也可取,但是它只支持QT5版本,如果没有版本问题,可以使用。
(2)、CPP等文件编码一律使用UTF8—BOM格式。
原因1:UTF8-无BOM在使用window编译器cl中编译会失败,当然除非你Windows中使用QT的Mingw版本编译开发。
原因2:不使用GBK的文件编码是为了更容易的兼容到linux版本与windows中,否则你需要改QtCreate的编码环境与linux的系统字符环境。
 

   其它知识:QString str( QObject::tr("中文") ) 能用么?

   答案:不能,tr( ) 中只能是英文。

   QT5版本取消了QTextCodec::setCodecForTr()方法。

并且你要明白QObject::tr是干嘛的。它是用于程序国际化使用的,也就可以界面文字翻译成不同的语言。你如果使用QObject::tr,你应该全部用英文表示,然后后面借助Linguist翻译成中文,就不会乱码了。详细请搜索“qt国际化"。

以上是关于qt4.6移植到qt4.7出现中文乱码的主要内容,如果未能解决你的问题,请参考以下文章

java 乱码问题-Dfile.encoding=UTF-8

在excel导入到数据库的时候 中文出现乱码 怎么转码啊

我的电脑有时候显示中文字体会出现乱码,是怎么回事?

Weblogic乱码解决过程

PHP插入数据到数据库出中,中文出现乱码~~全是问号

Win7使用Xshell出现乱码解决方法