setCodecForTr()
setCodeForTr(),Qt函式,包含于标準头档案QTextCodec,类QTextCodec中,主要功能是用于调整qt文字编码,使非英文字元可用。
调用时,使用QObject类中的tr来使用
基本介绍
- 外文名:setCodeForTr()
- 语言:C++
- 程式框架:Qt
- 成员函式:是
- 头档案:QTextCodec
- 类:QTextCodec
- 支持:Qt5-(不含)
实例
通过setCodecForTr()实现视窗中文输出
1
//project name:hello//main.cpp#include<QApplication>#include<QLabel>#include<QTextCodec>#include "hello.h"// 此处省略int main(int argc,char * argv[]){QApplication a(argc,argv);QTextCodec::setCodecForTr(QTextCodec::codecForLocale());/*修改字元编码,取消UTF-8带来的乱码,请注意codecForLocale,我们稍后将重点讨论这个函式*/QDialog w;Qlabel label(&w);label.setText(QObject::tr("你好,Qt!"));w.show();return a.exec;}
致命弱点
弱点
可能不少读者会发现,自己解决了中文乱码的难题,感觉这个函式和codecForLocale()很是好用,但是这里要提一下它的致命弱点,其实建议这两个函式不要使用,Qt5以上版本已经取消了这两个函式。
字元集决定了Qt中文字能否正常使用,如果未指定字元集,会直接按照UTF-8来处理字元串。
重新观察以上代码
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
好的,这里的codecForLocale()是一个空参数,这代表着一个很可怕的事实:使用系统指定的字元集。那幺会出现在英文系统、日文系统上再次乱码的情况,就算参数写上("gb18030"),任然解决不了问题。
那幺,真的就没有办法了吗?
解决方案
unicode可以实现跨语言。具体的我们可以使用fromLocal8Bit();
QLabel label;labell.setText(QString::fromLocal8Bit("你好,Qt"));