zoukankan      html  css  js  c++  java
  • QTextCodec::makeDecoder函数,plugins需要是动态链接库

    QT中的QString内容使用Unicode作为文本编码。但是实际系统中通常采用的是其他编码,例如GBK,utf8等。为了便于兼容这些格式,QT中还设置了两个字符串类型:

    QCString类: C类型字符串,必须以0结尾,也就是中间不能含有0. 例如GBK编码的字符串

    QByteArray类: 中间可以含有0.例如utf8编码的字符串

    为了便于编码转换,QT还提供了一套具备扩展性的编码转换器:

    QTextCodec

    这个类定义了编码转换器的接口,可以以插件方式继承这个类,实现各种编码转换器。

    当然,QT也内置了多种编码转换器(不包括GBK)。

    在使用编码转换器时,有以下几种方式:

    1. 在程序开始位置设置QObject的成员函数tr()的编码器,后面程序中都可以用tr()直接转换字符串;

    QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); //或者codecForName("GBK")

    … ….

    QString str(tr(“本地文本”));

    2. 用QTextCodec的toUnicode方法来显示中文

    QTextCodec *codec = QTextCodec::codecForLocale();

    QString a = codec->toUnicode("本地文本");

    3. 使用QString的fromLocal8Bit()函数族;

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

    通过比较,方法1对于界面文本处理是比较好的,可以一次设置,全局使用。而且tr函数可以用于国际化,在把软件转换为其他语言版本或者多语言版本时,只需通过qm文件就可以,非常方便。

    方法2使用非常灵活,适合于程序中处理特定编码字符串的时候使用. 例如读取文件内容。

    方法3只是为了方便QString类使用,而对QTextCodec类的toUnicode()函数进行的一些封装。效率上肯定要差一些。例如:fromLocal8Bit()就是利用了codeForLocale()解码器。

    可能遇到的问题:

    调用QTextCodec::codecForLocale();没有问题。

    而调用plugins中的codecs,例如GBK. QTextCodec:: codecForName("GBK")就找不到相应的解码器,得到空指针。

    这种情况通常是你的QT编译时是作为静态链接库形式编译的。而plugins需要是动态链接库。要先检查你用到的plugins是否已经编译了,插件都放在qtXXX/plugins/文件夹下了。例如GBK,GB18030,GB2312的解码器的调试版本就是qtXXX/plugins/codecs/qcncodecsd4.dll。

    //app.addLibraryPath(QObject::tr("C://qt-win-opensource-src-4.4.3//plugins")); //这段代码不用加入也可以正常执行,如果加入的话,路径中最好不要有中文

    QTextCodec *codec = QTextCodec::codecForName("GBK");

    QString teststr = codec->toUnicode("GB编码");

    此外,为了对某些分块的字符串(例如从网络中获得的字符串片段)进行编码转换,QT还提供了一个QTextDecoder的辅助类,可以帮助对这类字符串进行解码。

    QTextCodec *codec = QTextCodec::codecForName("Shift-JIS");

    QTextDecoder *decoder = codec->makeDecoder();

    QString string;

    while (new_data_available()) {

    QByteArray chunk = get_new_data();

    string += decoder->toUnicode(chunk);

    }

    http://blog.sina.com.cn/s/blog_a401a1ea0101fh3z.html

  • 相关阅读:
    使用eNSP配置灵活QinQ
    使用eNSP配置端口QinQ
    python-多线程编程
    front-end plugin, generate pdf with html5 and jquery
    dotnetnuke peek. glance.
    a
    租房了,说一个奇妙的事情。
    总是容易忘记zen coding里怎么写标签text, mark一下吧
    springboot+druid连接池及监控配置
    springboot +mybatis分页插件PageHelper
  • 原文地址:https://www.cnblogs.com/findumars/p/6223423.html
Copyright © 2011-2022 走看看