• 5272阅读
  • 3回复

[提问]Qt的中文编码 全解析[转] [复制链接]

上一主题 下一主题
离线gota
 
只看楼主 倒序阅读 楼主  发表于: 2011-07-15
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
我的中文为什么没法显示?在Qt使用中经常有朋友会碰到这样的问题
通过google搜索,会发现已经有人解决过了,无非就是重新设置一下默认的编码器
先调用下面两个函数之一
1    QTextCodec *textc=QTextCodec::codecForName(“gbk”);
2    QTextCodec *textc=QTextCodec::codecForName(“utf8″);
然后调用下面3个函数之一
1    QTextCodec::setCodecForCStrings(textc);
2    QTextCodec::setCodecForTr(textc);
3    QTextCodec::setCodecForLocale(textc);
至于调用哪一个是不知道的,只好挨着试,反正组合也不多。问题是解决了。但下次还是这么试。
下面我们来看看这几个函数都作用在什么地方。
1. setCodecForCStrings(textc)
这个函数主要用在用字符常量或者QByteArray构造QString对象时使用的默认编码方式。比如下面一个例子
01    23 int main(int argc,char *argv[]){
02    24     QApplication app(argc,argv);
03    25
04    26     QTextCodec *tc=QTextCodec::codecForName(“utf8″);
05    27     QTextCodec::setCodecForCStrings(tc);
06    28     QString str(“宁愿看见两个恶魔在拔河,也不愿看见一只天使在跳舞。”);
07    29     QPushButton ww(str);
08    30     ww.show();
09    31
10    32     app.exec();
11    33 }
如果把26,27行的地方注释掉,那么我们在QPushButton上看到的将是一堆乱码。因为在默认情况下QString把构造函数的字符串参数当成标准拉丁字符,很显然是会出现乱码的。如果是在Linux下的话你在编辑器里输入的时候,默认文本格式是”utf8″,如果你是在windows下做开发那么26行的地方很可能要改成”gbk”了。
2. setCodecForTr(textc)
这个函数的作用是设置传给tr函数时的默认字串编码
01    23 int main(int argc,char *argv[]){
02    24     QApplication app(argc,argv);
03    25
04    26     QTextCodec *tc=QTextCodec::codecForName(“utf8″);
05    27     QTextCodec::setCodecForCStrings(tc);
06    28     QString str(QObject::tr(“宁愿看见两个恶魔在拔河,也不愿看见一只天使在跳舞。”));
07    29     QPushButton ww(str);
08    30     ww.show();
09    31
10    32     app.exec();
11    33 }
同样一个例子,我在28行的地方加了tr之后,运行的结果又不能正常显示中文了。需要将27行的函数改成setCodecForTr就可以了。
3. QTextCodec::setCodecForLocale(textc)
这个函数主要用于设置和对本地文件系统读写时候的默认编码格式。比如通过流读取一个文件时内容时的编码格式。或者通过qDebug()输出打印信息时的编码。
1    7 int main(int argc,char *argv[]){
2    8     QTextCodec *tc=QTextCodec::codecForName(“utf8″);
3    9     QTextCodec::setCodecForCStrings(tc);
4    10     QString str(“宁愿看见两个恶魔在拔河,也不愿看见一只天使在跳舞。”);
5    11
6    12     QTextCodec *tl=QTextCodec::codecForName(“utf8″);
7    13     QTextCodec::setCodecForLocale(tl);
8    14     qDebug()<<str;
9    15 }
你也可以试试把第12行去掉或者编码改成”gbk”,就会大概明白setCodecForLocale的作用了。
原文链接:http://www.satsuns.com/qt/1376.html

离线留心屿

只看该作者 1楼 发表于: 2011-07-16
很好啊
离线dbzhang800

只看该作者 2楼 发表于: 2011-07-16
离线gota
只看该作者 3楼 发表于: 2011-07-17
呵呵。。我是在csdn 的qt.cndn.net上面看到的。
快速回复
限100 字节
 
上一个 下一个