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

时间: 2024-10-15 18:53:34

QTextCodec::makeDecoder函数,plugins需要是动态链接库的相关文章

More Effective C++----(24)理解虚拟函数、多继承、虚继承和RTTI所需的代价

Item M24:理解虚拟函数.多继承.虚继承和RTTI所需的代价 C++编译器们必须实现语言的每一个特性.这些实现的细节当然是由编译器来决定的,并且不同的编译器有不同的方法实现语言的特性.在多数情况下,你不用关心这些事情.然而有些特性的实现对对象大小和其成员函数执行速度有很大的影响,所以对于这些特性有一个基本的了解,知道编译器可能在背后做了些什么,就显得很重要.这种特性中最重要的例子是虚拟函数. 当调用一个虚拟函数时,被执行的代码必须与调用函数的对象的动态类型相一致:指向对象的指针或引用的类型

静态链接库(lib)、动态链接库(dll)与动态链接库的导入库(lib)

静态链接库与动态链接库相对应.动态链接库的导入库不同于以上两种库. 1.静态链接库(lib) 程序编译一般需经编辑.编译.连接.加载和运行几个步骤.在我们的应用中,有一些公共代码是需要反复使用,就把这些代码编译为"库"文件(lib), 这种LIB中有函数的实现代码.在静态编译时,它是将LIB中的代码加入目标模块(EXE或者DLL)文件中,所以链接好了之后,LIB文件就没有用了. 2.动态链接库(dll) 动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其

(转载)DLL动态链接库编程入门之二:非MFC DLL

上一节中讲解的是DLL概论及其调试和查看,本节将为大家详解非MFC DLL的相关内容.  1.一个简单的DLL 上一节给出了以静态链接库方式提供add函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的add函数. 如图1,在VC++中new一个Win32 Dynamic-Link Library工程dllTest.注意不要选择MFC AppWizard(dll),因为用MFC AppWizard(dll)建立的将是后面要讲述的MFC动态链接库. 图1 建立一个非MFC DLL 在

MinGW gcc 生成动态链接库 dll 的一些问题汇总

网络上关于用 MinGW gcc 生成动态链接库的文章很多.介绍的方法也都略有不同.这次我在一个项目上刚好需要用到,所以就花了点时间将网上介绍的各种方法都实验了一遍.另外,还根据自己的理解试验了些网上没有提到的方法.这里,我就将这两天获得的成果总结一下. 首先说一下我的开发环境: gcc version 4.9.2 (Rev1, Built by MSYS2 project) Target: i686-w64-mingw32 Thread model: posix --disable-sjlj-

C++ 动态链接库和静态链接库

概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了"无库-静态链接库-动态链接库"的时代. 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了.但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以"动态"地引用和卸载这个与EXE

VC API常用函数简单例子大全[转]

第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCSTR lpWindowName); 第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时填两个参数的,也就是说,你只要知道窗口的类名或窗口的标题就可以了,没有的那个就用NULL代替. 比如现在有一个窗口名为"无标题.txt - 记事本"的记事本程序.那么我就可以用上面的函数获得这个

01 动态链接库基础

DLL是一个包含函数和数据的模块, 它们可以被其他模块(应用程序或DLL)使用. DLL可以定义两种函数: <1>导出函数   <2>内部函数 . 导出函数可以被内部或其他模块调用. 内部函数只能在DLL内部被调用. About Dynamic-Link Libraries 动态连接 允许一个模块在加载或运行时,仅仅只需包含定位一个动态库导出函数的信息,而无需将这个动态库整个编译进模块中. 调用一个DLL中的函数,有两种方法: <1> load-time dynamic

VC++动态链接库(DLL)编程深入浅出(zz)

1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了"无库-静态链接库-动态链接库"的时代. 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了.但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以"动态"地引用和卸载这个与E

dll = MinGW gcc 生成动态链接库 dll 的一些问题汇总

MinGW gcc 生成动态链接库 dll 的一些问题汇总 https://blog.csdn.net/liyuanbhu/article/details/42612365 网络上关于用 MinGW gcc 生成动态链接库的文章很多.介绍的方法也都略有不同.这次我在一个项目上刚好需要用到,所以就花了点时间将网上介绍的各种方法都实验了一遍.另外,还根据自己的理解试验了些网上没有提到的方法.这里,我就将这两天获得的成果总结一下. 首先说一下我的开发环境: gcc version 4.9.2 (Rev