linux下使用libiconv库转码
iconv命令实现linux下字符集编码的转换
1.iconv命令用法如下:
2.iconv函数:
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
详细说明:http://linux.die.net/man/3/iconv_open
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。
详细说明:http://pubs.opengroup.org/onlinepubs/009695399/functions/iconv.html
大部分情形是inbuf 不为NULL,*inbuf也不为NULL。这种情况下,iconv函数将以*inbuf起始的多字节序列转换到以*outbuf起始的多字节序列。从*inbuf开始读取,最多*inbytesleft字节,转换后,从*outbuf开始写入,最多*outbytesleft字节。
iconv函数一次转换一个多字节字符,每次字符转换,*inbuf增加已转换的字节数,*inbytesleft相应地减少已转换的字节数;对应地,*outbuf和*outbytesleft作相应的修改,同时修改cd的转换状态,因此,相应的操作要针对其副本。
以下四种情况不能完成转换:
1.输入中含无效的多字节序列。此时,它将errno设置为EILSEQ并返回(size_t)(-1)。*inbuf指向无效序列的最左端。
2.输入的字节序列已经全部被转换过,也就是*inbytesleft减少至0。此时,iconv返回本次调用中完成转换的数目(可逆的转换不计入)。
3.输入中以不完整多字节序列作结尾。此时,它将errno设置为EINVAL并返回(size_t)(-1)。*inbuf指向不完整多字节序列的最左端。
4.输出缓存区没有足够空间来存储下一个字符。此时,它将errno设置为E2BIG并返回(size_t)(-1)。
另一种情形是inbuf 为NULL或*inbuf为NULL,但*outbuf 不为NULL,*outbuf也不为NULL。这种情况下,iconv函数试图将cd的转换状态设置为初始状态并store a corresponding shift sequence at *outbuf。从*outbuf开始,最多写入*outbytesleft字节。如果输出缓存区没有足够空间来存储这个重置后的序列,他将errno设置为E2BIG并返回(size_t)(-1)。反之,*outbuf增加写入的字节数和*outbytesleft减少写入的字节数。
第三种情形是inbuf 为NULL或*inbuf为NULL,*outbuf 为NULL或*outbuf为NULL。这种情况下,iconv函数试图将cd的转换状态设置为初始状态。
返回值:
iconv函数返回本次调用中转换的字符数,可逆的转换不计入。出错时,它将修改errno并返回(size_t)(-1)。
错误:
E2BIG *outbuf没有足够的空间。
EILSEQ 输入含无效的多字节序列。
EINVAL 输入含不完整多字节序列。
(3) int iconv_close(iconv_t cd);
此函数用于关闭转换句柄,释放资源。
c代码示例
//将utf-8转为gb2312,代码仅供参考。
iconv_t cd;
char src_utf8[]="utf8编码";
char *inbuf=src_utf8;
int inen=strlen(inbuf);
int outlen=;
char *outbuf=(char *)malloc(outlen); cd=iconv_open("gb2312","utf-8");
iconv(cd,&inbuf,(size_t *)&inlen,&outbuf,&outlen);
printf("%s\n",outbuf);
iconv_close(cd);
free(outbuf);
linux下使用libiconv库转码的更多相关文章
- linux下so动态库一些不为人知的秘密
linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识. 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些 ...
- linux下so动态库一些不为人知的秘密(中)
上一篇(linux下so动态库一些不为人知的秘密(上))介绍了linux下so一些依赖问题,本篇将介绍linux的so路径搜索问题. 我们知道linux链接so有两种途径:显示和隐式.所谓显示就是程序 ...
- linux下安装uuid库
1.linux 下安装UUID库 1.1)ubuntu下安装uuid链接库 sudo apt-get install uuid-dev 1.2)CentOS yum install libuuid-d ...
- linux下MySQL 5.6源码安装
linux下MySQL 5.6源码安装 1.下载:当前mysql版本到了5.6.20 http://dev.mysql.com/downloads/mysql 选择Source Code 2.必要软件 ...
- linux下so动态库一些不为人知的秘密(转)
linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识.基本上每一个linux 程序都至少会有一个动态库,查看某个程序使用了那些动态库, ...
- linux下so动态库一些不为人知的秘密(中二)
继续上一篇< linux下so动态库一些不为人知的秘密(中) >介绍so搜索路径,还有一个类似于-path,叫LD_RUN_PATH环境变量, 它也是把路径编译进可执行文件内,不同的是它只 ...
- linux下so动态库一些不为人知的秘密(上)
linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识. 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使 ...
- 如何在Linux下添加函数库
如何为Linux增加库一. 静态库在Linux下的静态库是以.a为后缀的文件.1. 建静态库h1.c 源文件#include<stdio.h>void hello1(){printf(“t ...
- Linux下USB suspend/resume源码分析【转】
转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron ...
随机推荐
- YTU 2615: AB编程题--世界杯小组赛
2615: AB编程题--世界杯小组赛 时间限制: 1 Sec 内存限制: 128 MB 提交: 100 解决: 35 题目描述 注:本题目自由设计,但必须使用类进行代码设计. 世界杯32支参赛队 ...
- HDU4749 Parade Show(KMP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题意:给出两个数字串A.B.问A中有多少不相交的子串a能匹配B.匹配的意思是a中任意两个位置i和 ...
- binary-tree-maximum-path-sum(mock)
注意: // 注意,如果一个类放在另一个类里面,初始化时候会报错 Solution is not a enclosing class// 这是因为如果TreeNode不是static,那么要求先有外部 ...
- JS function的定义方法,及function对象的理解。
废话篇: 今天看到了Function的内容,各种晕,各种混淆有木有.简直是挑战个人脑经急转弯的极限啊.不过,最终这一难题还是被我攻克了,哇咔咔.现在就把这东西记下来,免得到时候又忘了就悲催了.... ...
- Qt之国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)
简介 使用Qt的时候,经常会遇到英文问题,例如:QMessageBox中的按钮.QLineEdit.QSpinBox.QScrollBar中的右键菜单等.通常情况下,我们软件都不会是纯英文的,那么如何 ...
- HDU 3544 (不平等博弈) Alice's Game
切巧克力的游戏,想得还是不是太明白. 后者会尽量选前着切后其中小的一块来切,那么先手须尽量取中间来切. So?题解都是这么一句话,不知道是真懂了还是从别人那抄过来的. 后来找到一个官方题解,分析得比较 ...
- ASP.NET MVC 4 WebAPI. Support Areas in HttpControllerSelector
This article was written for ASP.NET MVC 4 RC (Release Candidate). If you are still using Beta versi ...
- BZOJ 1103 大都市
dfs序+BIT. #include<iostream> #include<cstdio> #include<cstring> #include<algori ...
- [转]Git介绍
Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版 本控制工具可以对开发产生如此之多的影响,文章分为两部分, ...
- HDU pog loves szh II (数的处理)
题意: 给一个序列,找出两个数字a和b(可以相等但不可相同),要求(a+b)%p的结果最大. 思路: 先将所有元素模p,再排序.要找出a和b,分两种情况,a+b>p和a+b<p.第一种,肯 ...