怎样学习使用libiconv库
About My Learn or Study etc.libiconv库是一个基于GNU协议的开源库,主要是解决多语言编码处理转换等应用问题。
怎样学习使用libiconv库?对于刚接触到人来说,这篇文章不妨去看一看,若已经用到过该库的人,在应用的过程中可能遇到一些问题,我们可以一起来探讨,我的联系方式是 cnangel@gmail.com 。几个函数原型:
iconv_t iconv_open(const char *tocode, const char *fromcode);
size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
int iconv_close(iconv_t cd);其中:
iconv_open是打开一个编码流,类似于打开一个编码管道(通道),出错则返回 -1;
iconv用于具体输入的转换,如果出错,则返回 -1,否则返回 0;
iconv_close是关闭该管道(通道)。
举个例子:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iconv.h>#define OUTLEN 255
int covert(char *, char *, char *, size_t , char *, size_t );int main(int argc, char *argv[])
{
char *input = "中国";
size_t len = strlen(input);
char *output = (char *)malloc(OUTLEN);
covert("UTF-8", "GBK", input, len, output, OUTLEN);
printf("%s\n", output);
return 0;
}int covert(char *desc, char *src, char *input, size_t ilen, char *output, size_t olen)
{
char **pin = &input;
char **pout = &output;
iconv_t cd = iconv_open(desc, src);
if (cd == (iconv_t)-1)
{
return -1;
}
memset(output, 0, olen);
if (iconv(cd, pin, &ilen, pout, &olen)) return -1;
iconv_close(cd);
return 0;
}这里面covert函数就是用于将编码进行转换,其中要注意的地方是iconv函数的传递参数:
1,iconv传递有5个参数;
2,第3个参数和第5个参数一般是input和output实际分配的大小,一般是 sizeof(type)*strlen(string);
3,第4个参数是不能直接传递指针的地址,因为iconv函数能够改变指针的值,所以需要复制一份指针变量;
如果对于大量需要转换的编码,上述函数covert不适合该方式,一是内存的限制不能一次调用,二是若分多次调用会频繁打开一个编码管道(通道),导致资源浪费,最好的办法还是拆开该函数根据情况使用。
这里补充一下代码:
translateSP.h:
#ifndef __TRANSLATESP_H_
#define __TRANSLATESP_H_
#include <iconv.h>
class TranslateSP
{
public:
TranslateSP():i_cd(0){}
TranslateSP(const char *from_charset,const char *to_charset)
{
i_cd = iconv_open(to_charset, from_charset);
if ((iconv_t)-1 == i_cd) printf("iconv open error!\n");
}
~TranslateSP()
{
if (i_cd)
iconv_close(i_cd);
}
public:
size_t translate(char *src, size_t srcLen, char *desc, size_t descLen);
size_t convert(const char *from_charset, const char *to_charset,
char *src, size_t srcLen, char *desc, size_t descLen);
private:
iconv_t i_cd;
};
#endiftranslateSP.cpp:
#include "translateSP.h"
#define MAX_LEN 200
size_t TranslateSP::translate(char *src, size_t srcLen, char *desc, size_t descLen)
{
char **inbuf = &src;
char **outbuf = &desc;
memset(desc, 0, descLen);
return iconv(i_cd, inbuf, &srcLen, outbuf, &descLen);
}
size_t TranslateSP::convert(const char *from_charset, const char *to_charset,
char *src, size_t srcLen, char *desc, size_t descLen)
{
char **inbuf = &src;
char **outbuf = &desc;
iconv_t cd = iconv_open(to_charset, from_charset);
if ((iconv_t)-1 == cd) return (size_t)-1;
memset(desc, 0, descLen);
size_t n = iconv(cd, inbuf, &srcLen, outbuf, &descLen);
iconv_close(cd);
return n;
}
int main(int argc, char *argv[])
{
char *str = "我爱zhong国! %#@#";
char *str1 = "i大量需要转换的编码";
char *str2 = "函数就是用于将hello进行转换";
char newstr[MAX_LEN];
TranslateSP tsp;
tsp.convert("utf-8", "gbk", str, strlen(str), newstr, MAX_LEN);
printf("%s\n", newstr);
TranslateSP newtsp("UTF-8", "GBK");
newtsp.translate(str1, strlen(str1), newstr, MAX_LEN);
printf("%s\n", newstr);
newtsp.translate(str2, strlen(str2), newstr, MAX_LEN);
printf("%s\n", newstr);
return 0;
}编译:
g++ translateSP.cpp -o test
./test
我爱zhong国! %#@#
i大量需要转换的编码
函数就是用于将hello进行转换(以上输出是GBK编码)
怎样学习使用libiconv库的更多相关文章
- 利用VS编译libiconv库
参考文章:http://blog.csdn.net/ghevinn/article/details/9834119 关于中文字符编码问题,这篇文章里面讲的很详细-->http://www.tui ...
- linux下使用libiconv库转码
iconv命令实现linux下字符集编码的转换 windows下的文件复制到linux下时常会乱码,因为windows下文件编码为GBK,linux下默认文件编码为UTF-8,故需要libiconv库 ...
- ZhuSuan 是建立在Tensorflow上的贝叶斯深层学习的 python 库
ZhuSuan 是建立在Tensorflow上的贝叶斯深层学习的 python 库. 与现有的主要针对监督任务设计的深度学习库不同,ZhuSuan 的特点是深入到贝叶斯推理中,从而支持各种生成模式:传 ...
- libiconv库的安装和使用
1.libiconv包的下载路径 包的下载页面http://www.gnu.org/software/libiconv/ 2.编译安装libiconv库 $tar zxvf libiconv-1.14 ...
- 常见的LINUX发行版安装libiconv库方法
今天编译程序,发现程序报错,如下 cannot find -liconv collect2: ld returned 1 exit status 或者 undefined reference to ` ...
- Python学习day45-数据库(总结)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day44-数据库(单表及多表查询)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day43-数据库(多表关系)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习day42-数据库的基本操作(1)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
随机推荐
- 为什么开发人员对于PHP语言褒贬不一
PHP 语言,作为服务器端开发的脚本语言,在网站开发方面非常有名.从1995年 Rasmus Lerdorf 创建之后,W3Techs 的调查显示在已知的服务端编程语言中,PHP 占了82%.其中不乏 ...
- Delphi控件大全:www.vclcomponents.com
torry的排版不行了,还好找到它.
- QT VS配置UNICODE问题
默认情况下,使用VSQT插件 导入.pro后,会自动在项目文件里面预定义好宏UNICODE,可以把该宏去掉,以免造成其他程序,使用多字节的代码出错 去除的两个方法 1.打开Propject->P ...
- Linux下静态编译Qt程序
一般情况下,我们用Qt编译出来的程序是要依赖于系统Qt库的,也就是这个程序移到别的没有安装Qt库的系统上是不能使用的.会提示缺少……库文件之类的错误.这就是动态编译的结果. 但是如果我们想编译一个程序 ...
- Inno Setup设定只运行一个安装包
原文 http://zwkufo.blog.163.com/blog/static/25882512010292526944/?suggestedreading&wumii 在安装包中,经常会 ...
- apache httpd, nginx, tomcat, jboss
web上的server都叫web server,但是大家分工也有不同的. nginx常用做静态内容服务和代理服务器(不是你FQ那个代理),直面外来请求转发给后面的应用服务(tomcat,django什 ...
- 必学100个常用linux命令大全
1,echo “aa” > test.txt 和 echo “bb” >> test.txt //>将原文件清空,并且内容写入到文件中,>>将内容放到文件的尾部 2 ...
- 顶尖数据挖掘教学案例库(TipDM-C10)产品白皮书
顶尖数据挖掘教学案例库 (TipDM-C10) 产 品 说 明 书 广州泰迪智能科技有限公司 版权所有 地址: 广州市经济技术开发区科学城232号 网址: ht ...
- 解决ZBarSDK 中文出现乱码
使用ZBarSDK进行二维码解释时出现乱码是因为ZBarSDK在解释时使用的字符集不对,需在ZBarSDK的源码中更正. 1.可以到http://sourceforge.net/p/zbar/_lis ...
- Jenkins的安全控制
在默认配置下,Jenkins是没有安全检查的.任何人都可以以匿名用户身份进入Jenkins,设置Jenkins和Job,执行build操作.但是,Jenkins在大多数应用中,尤其是暴露在互联网的应用 ...