Qt的中文编码

上一篇 / 下一篇  2012-04-20 13:07:36 / 个人分类:QT开发

我的中文为什么没法显示?在Qt使用中经常有朋友会碰到这样的问题。
通过google搜索,会发现已经有人解决过了,无非就是重新设置一下默认的编码器

先调用下面两个函数之一
QTextCodec *textc=QTextCodec::codecForName(“gbk”);
QTextCodec *textc=QTextCodec::codecForName(“utf8″);

然后调用下面3个函数之一
QTextCodec::setCodecForCStrings(textc);
QTextCodec::setCodecForTr(textc);
QTextCodec::setCodecForLocale(textc);

至于调用哪一个是不知道的,只好挨着试,反正组合也不多。问题是解决了。但下次还是这么试。

下面我们来看看这几个函数都作用在什么地方。

1. setCodecForCStrings(textc)
这个函数主要用在用字符常量或者QByteArray构造QString对象时使用的默认编码方式。比如下面一个例子
23 int main(int argc,char *argv[]){
24     QApplication app(argc,argv);
25
26     QTextCodec *tc=QTextCodec::codecForName(“utf8″);
27     QTextCodec::setCodecForCStrings(tc);
28     QString str(“宁愿看见两个恶魔在拔河,也不愿看见一只天使在跳舞。”);
29     QPushButton ww(str);
30     ww.show();
31
32     app.exec();
33 }
如果把26,27行的地方注释掉,那么我们在QPushButton上看到的将是一堆乱码。因为在默认情况下QString把构造函数的字符串参数当成标准拉丁字符,很显然是会出现乱码的。如果是在Linux下的话你在编辑器里输入的时候,默认文本格式是”utf8″,如果你是在windows下做开发那么26行的地方很可能要改成”gbk”了。

2.  setCodecForTr(textc)
这个函数的作用是设置传给tr函数时的默认字串编码
23 int main(int argc,char *argv[]){
24     QApplication app(argc,argv);
25
26     QTextCodec *tc=QTextCodec::codecForName(“utf8″);
27     QTextCodec::setCodecForCStrings(tc);
28     QString str(QObject::tr(“宁愿看见两个恶魔在拔河,也不愿看见一只天使在跳舞。”));
29     QPushButton ww(str);
30     ww.show();
31
32     app.exec();
33 }
同样一个例子,我在28行的地方加了tr之后,运行的结果又不能正常显示中文了。需要将27行的函数改成setCodecForTr就可以了。

3. QTextCodec::setCodecForLocale(textc)
这个函数主要用于设置和对本地文件系统读写时候的默认编码格式。比如通过流读取一个文件时内容时的编码格式。或者通过qDebug()输出打印信息时的编码。
7 int main(int argc,char *argv[]){
8     QTextCodec *tc=QTextCodec::codecForName(“utf8″);
9     QTextCodec::setCodecForCStrings(tc);
10     QString str(“宁愿看见两个恶魔在拔河,也不愿看见一只天使在跳舞。”);
11
12     QTextCodec *tl=QTextCodec::codecForName(“utf8″);
13     QTextCodec::setCodecForLocale(tl);
14     qDebug()<<str;
15 }
你也可以试试把第12行去掉或者编码改成”gbk”,就会大概明白setCodecForLocale的作用了。

Tags: i18n, Qt4
This entry was posted on Friday, July 3rd, 2009 at 12:25 PM and is filed under Qt技术. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

8 Responses to “谈谈Qt的中文编码~”

  1. santhtonysays:

    正碰上这个问题呢

    Reply
  2. H.Kingsays:

    有了中文如果没有中文字体的话一样显示不出来,如何让程序调用中文字体呢???

    Reply
  3. Thinkersays:

    按照这个方法试了一下,我必须把编码设为gbk才不会乱码,设utf-8都是乱码。怎么回事?
    我是Windows平台qtcreater自动安装的编译环境。

    Reply
  4. 有了中文如果没有中文字体的话一样显示不出来,如何让程序调用中文字体呢?says:

    H.King说:
    有了中文如果没有中文字体的话一样显示不出来,如何让程序调用中文字体呢???

    我觉得这个问题也是很重要的,字体和字符解码完全是两回事。如果解码设置正确,但是字体错误,那显示出来的文字估计就是方块字。

    那么qt4中的font目录默认是放在哪里呢?要用什么环境变量吗?
    谁能回答?

    Reply
  5. kjpioosays:

    QTextCodec *tc=QTextCodec::codecForName(”utf8″);
    应该是QTextCodec *tc=QTextCodec::codecForName(”utf-8″);吧?

    Reply
  6. _臭 虫_says:

    文章里不是写了么~,windows要用gbk

    Reply
  7. shirokisays:

    不管你的系统默认用什么编码, 可以肯定的是同一时刻只能用一个编码, 所以你GBK正常别的编码乱码是极其正常的. 说明你的系统用的是GBK编码, 其他编码的内容要想显示都要转成GBK才行.

    Reply
  8. _臭 虫_says:

    odecForName(”utf8″) 和 odecForName(”utf-8″) 都可以:)


TAG: QT Qt qt Qt的中文编码

 

评分:0

我来说两句

Open Toolbar