命令行"iconv --list" 查看Linux操作系统支持的字符集
iconv_open 设置字符集转化 --iconv_t iconv_open(const char *tocode, const char *fromcode); --参数tocode目标字符集的字符串 --参数fromcode源字符集的字符串 --函数成功返回描述符,失败返回-1,并且设置errno --打开后,必须使用iconv_close()函数关闭描述符
iconv 将inbuf字符集的字符串转化成outbuf新字符集下的字符串 --size_t iconv(iconv_t cd,char **inbuf, size_t *inbytesleft,char **outbuf, size_t *outbytesleft); --参数cd表示iconv_open()函数返回的描述符 --参数inbuf需要转化的字符串的指针 --参数inbytesleft需要转化字符串长度的指针 --参数outbuf目标字符串的指针 --参数outbytesleft目标字符串长度的指针必须设置为目标字符串的最大长度 --函数失败返回-1,并且设置errno
//字符集转码 GBK--UTF-8 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <iconv.h> int gbktoutf8(char *src, size_t *srclen, char *dest, size_t * destlen) { if(src==NULL||srclen==NULL||dest==NULL||destlen==NULL) { printf("function gbktoutf8 param not correct! "); return -1; } //将GBK字符集转化成UTF-8字符集 iconv_t cd = iconv_open("UTF8", "GBK"); if (cd == (iconv_t)-1) { printf("iconv open failed ! error message :%s ", strerror(errno)); return -1; } size_t rc = iconv(cd, &src, srclen, &dest, destlen); if (rc < 0) { printf("iconv failed ! error message :%s ", strerror(errno)); return -1; } iconv_close(cd); return 0; } int main(int arg, char *args[]) { if (arg < 2) { printf("please print two param ! "); return -1; } //读一个windows文件 FILE *pfr = NULL; pfr = fopen(args[1], "r"); if (pfr == NULL) { printf("open the file failed ! error message :%s ", strerror(errno)); return -1; } char srcbuf[1024] = { 0 }; size_t srclen = 0; char destbuf[1024] = { 0 }; size_t destlen = 0; //read the file while (!feof(pfr)) { fgets(srcbuf,sizeof(srcbuf),pfr); srclen=strlen(srcbuf); /*必须设置返回目标字符串的长度是sizeof(destbuf),不然返回的字符串是空字符串*/ destlen = sizeof(destbuf); //转化 if(gbktoutf8(srcbuf,&srclen,destbuf,&destlen)<0) { break; } printf("%s",destbuf); memset(destbuf,0,sizeof(destbuf)); memset(srcbuf,0,sizeof(srcbuf)); } fclose(pfr); return 0; }
windows系统下的文本文件一般都是UCS-2字符集或者GBK字符集