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
QTextCodec::makeDecoder函数,plugins需要是动态链接库的更多相关文章
- VC++动态链接库(DLL)编程深入浅出(zz)
VC++动态链接库(DLL)编程深入浅出(zz) 1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用 ...
- Linux与Windows中动态链接库的分析与对比
摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系 ...
- Linux下动态链接库和静态链接库
第一部分:编译过程 先了解一下linux下C代码的编译过程,C代码的编译,一般分成四个阶段,包括:预编译,编译,汇编和链接,这四个阶段的分工是 预处理过程,负责头文件展开,宏替换,条件编译的选择,删除 ...
- VC++动态链接库(DLL)编程深入浅出
1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...
- VC API常用函数简单例子大全(1-89)
第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...
- 静态链接库(lib)、动态链接库(dll)与动态链接库的导入库(lib)
静态链接库与动态链接库相对应.动态链接库的导入库不同于以上两种库. 1.静态链接库(lib) 程序编译一般需经编辑.编译.连接.加载和运行几个步骤.在我们的应用中,有一些公共代码是需要反复使用 ...
- Linux 关于动态链接库以及静态链接库的一些概念
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀.例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhe ...
- VC++动态链接库(DLL)编程深入浅出(二)
好,让我们正式进入动态链接库的世界,先来看看最一般的DLL,即非MFC DLL 上节给大家介绍了静态链接库与库的调试与查看,本节主要介绍非MFC DLL. 4.非MFC DLL 4.1一个简单的DLL ...
- VC++动态链接库(DLL)编程深入浅出(一)
1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...
随机推荐
- SU Demos-02Filtering-03Sudipfilt
不足之处,欢迎各位博友批评指正. 进入目录,依照惯例先看Readme, 第一个脚本, 下面是运行结果: 第二个脚本: 运行结果如下: 第三个脚本: 运行结果:
- 01背包 URAL 1073 Square Country
题目传送门 /* 题意:问n最少能是几个数的平方和 01背包:j*j的土地买不买的问题 详细解释:http://www.cnblogs.com/vongang/archive/2011/10/07/2 ...
- HDU2196 Computer(树形DP)
和LightOJ1257一样,之前我用了树分治写了.其实原来这题是道经典的树形DP,感觉这个DP不简单.. dp[0][u]表示以u为根的子树中的结点与u的最远距离 dp[1][u]表示以u为根的子树 ...
- ZOJ2930 The Worst Schedule(最小割)
题目大概说有n个任务,每个任务可以提前或推迟,提前或推迟各有一定的费用,有的任务一旦推迟另一个任务也必须推迟,问怎么安排任务使花费最少,且最少花费的条件下提前的任务数最多能多少. 问题就是要把各个任务 ...
- LightOJ1025 The Specials Menu(区间DP)
给一个字符串,问有几种删字符的方式使删后的非空字符串是个回文串. 当然区间DP:dp[i][j]表示子串stri...strj的方案数 感觉不好转移,可能重复算了.我手算了"AAA" ...
- BZOJ4032 : [HEOI2015]最短不公共子串
第一问: 对B串建立SAM,暴力枚举A的每个子串,在SAM上走,若失配则可行. 第二问: 设g[i][j]表示B串的第i个字符之后最早出现的字符j的位置,暴力枚举A的每个子串,按照g贪心地走,若失配则 ...
- 10个国内外jQuery的CDN性能大比拼
jQuery是前端开发最常见也是最流行的javascript库,如何去加载它才能使我们的项目性能更好以及问什么要用CDN?当用户访问自己的站点时从服务器加载文件,每个服务器同时只能下载2-4个文件,这 ...
- 洛谷 P1019 单词接龙 Label:dfs
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- 关于javascript在作用域中的变量定义你所不知道的一些东西
//先看一段代码 var a = 100; function test(){ alert(a); var a = 200; } test(); /* 结果:undifined 原因:js引擎在执行sc ...
- 1. Nginx
参考: http://www.darrenfang.com/2014/02/install-php-with-nginx-on-ubuntu/ 安装: apt-get install python ...