Linux 字符集转化

命令行"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字符集

 

原文地址:https://www.cnblogs.com/zhanggaofeng/p/5910878.html