c语言使用iconv函数实现字符编码转换

17 篇文章 0 订阅
c语言使用iconv函数实现字符编码转换
linux下提供了iconv库来实现字符编码转换,先介绍下命令行:
iconv [-f encoding] [-t encoding] [inputfile ...]
这个用法比较简单。
使用编程方式就要用到三个函数,这三个函数都需要包含头文件#include <iconv.h>。分别为:iconv_open,iconv,iconv_close。
一般步骤为:先使用iconv_open打开一个字符转换的描述符,使用iconv执行实际的转换,转换完成后,使用iconv_close进行必要的清理工作。
介绍函数的使用方法:
1)iconv_open
函数原型为:
iconv_t iconv_open (const char* tocode, const char* fromcode);
这个函数返回一个把formcode编码的字符串转换成tocode编码的字符串的转换描述符。
如果发生错误返回(iconv_t)-1,同时设置errno。
2)iconv
函数原型为:
       size_t iconv(iconv_t cd,
                    char **inbuf, size_t *inbytesleft,
                    char **outbuf, size_t *outbytesleft);
这个函数利用iconv_open返回的转换描述符执行实际的转换操作。inbuf代表需要转换编码的字符地址,inbytesleft代表需要转换的字符个数地址,outbuf代表需要转换后的字符存放地址,outbytesleft代表存放转换后字符的最大个数地址。这个函数会修改传进来的参数,所以,要用另外用四个变量来表示这个地址。
函数执行失败返回(size_t)-1,errno被设置,否则,返回以不可逆的方式转换的字符个数,可逆转换的字符个数没有统计。
3)iconv_close
函数原型为:
       int iconv_close (iconv_t cd);
这个函数关闭之前调用iconv_open返回的描述符,释放内存空间,如果成功返回0,否则返回-1,errno被设置。
例子:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iconv.h>

#define BUFSIZE 1024

int utf2gbk(char *buf, size_t len)
{
	iconv_t cd = iconv_open("GBK", "UTF-8");
	if (cd == (iconv_t)-1) {
		perror("获取字符转换描述符失败!\n");
		return -1;
	}
	size_t sz = BUFSIZE * BUFSIZE;
	char *tmp_str = (char *)malloc(sz);
	// 不要将原始的指针传进去,那样会改变原始指针的
	size_t inlen = len;
	size_t outlen = sz;
	char *in = buf;
	char *out = tmp_str;
	if (tmp_str == NULL) {
		iconv_close(cd);
		fprintf(stderr, "分配内存失败!\n");
		return -1;
	}
	memset(tmp_str, 0, sz);
	if (iconv(cd, &in, &inlen, &out, &outlen) == (size_t)-1) {
		iconv_close(cd);
		return -1;
	}
	iconv_close(cd);
	return 0;
}

int main(int argc, char *argv[])
{
	char in[BUFSIZE] = "nihao1nih年后";
	int len = strlen(in);
	printf("%s\n", in);
	utf2gbk(in, len);
	printf("%s\n", in);
	return 0;
}


参考:http://www.cnblogs.com/xuxm2007/archive/2010/11/09/1872379.html
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值