介绍 :
iconv是一个用作转换字符编码的一个库,如gbk转utf8等等。具体支持的编码类型很多这里不具体列举了。
使用:
1.命令(linux)
iconv -f utf-8 -t gbk utf8.txt > gbk.txt
将utf8.txt以utf8的编码格式转化成gbk格式,并输出到gbk.txt中
2.函数
首先获取转换的句柄,主要为了设置转换前的格式及转换后的格式
iconv_t iconv_open(const char *__tocode, const char *__fromcode)
tocode: 转换后的类型
fromcode: 转换前的类型
返回值: 控制的句柄
然后开始转换
size_t iconv(iconv_t __cd, char **__restrict__ __inbuf, size_t *__restrict__ __inbytesleft, char **__restrict__ __outbuf, size_t *__restrict__ __outbytesleft)
cd 句柄
inbuf 需要转换的内容
inbytesleft 最多转换的字节数
outbuf 转换后的内容
outbytesleft 转换后最多存放在outbuf中的字节数
返回值 成功应该是返回0吧,失败返回-1. 但是跟原文介绍好像不太一样
RETURN VALUE
The iconv() function returns the number of characters converted in a
nonreversible way during this call; reversible conversions are not
counted. In case of error, it sets errno and returns (size_t) -1.
最后,关闭
int iconv_close(iconv_t __cd)
主要是使用这3个函数。下面给出例程
#include "iconv.h"
#include "fcntl.h"
#include "string.h"
#include "malloc.h"
#include "stdio.h"
/**
* 文件编码转换
*/
int file_code_convert()
{
int ret;
int read_fd = open("utf8.txt",O_RDONLY|O_CREAT);
int write_fd= open("gbk.txt", O_RDWR|O_CREAT,0666); //建文件时会修改权限
char read_buf[1024] = {0};
size_t inLen ,outLen=1024 ;
char *outbuf = (char*)malloc(1024);
char *inbuf = (char*)malloc(1024); //这两块空间必须malloc,不可以用数组
char *ob = outbuf;
char *ib = inbuf; //用来记录上面两块空间的地址
inLen = read(read_fd, read_buf,1024);
memcpy(inbuf,read_buf,inLen);
/*
获取转换的句柄
tocode: 转换后的类型
fromcode: 转换前的类型
*/
iconv_t icv = iconv_open("GBK","UTF-8");
if(*(int*)icv == -1)
{
perror("iconv_open");
return -1;
}
/*
开始转换
cd 句柄
inbuf 需要转换的内容
inbytesleft 最多转换的字节数
outbuf 转换后的内容
outbytesleft 转换后最多存放在outbuf中的字节数
返回值 成功返回0吧
备注:完成后
inbytesleft 会返回转换的字节数
inbuf 会指向偏移 inbuf 字节的长度的地址
outbytesleft 会返回转换后的长度
outbuf 也同样会指向偏移 outbytesleft 字节的长度的地址
所以直接读inbuf和outbuf是读不出转化后内容
*/
ret = iconv(icv, &inbuf, &inLen ,&outbuf ,&outLen);
if(ret == -1)
{
perror("iconv");
return -1;
}
/*关闭*/
iconv_close(icv);
write(write_fd,ob,1024-outLen);
close(write_fd);
close(read_fd);
free(ob);
free(ib);
return 0;
}
注意,iconv传参不能传数组,谨记数组跟指针是两个概念