• 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字符集

     

  • 相关阅读:
    倒计时2(小于0时的格式)
    日期 Date()
    倒计时5(超过时间为0:0:0)
    倒计时4
    倒计时3
    Lucene_solr
    Solr与tomcat搭建(搭建好)
    SSM(Spring-SpringMvc-Mybatis)练习
    SpringMvc
    Mybatis(使用)与Spring整合
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5910878.html
Copyright © 2020-2023  润新知