在C++编程中使用iconv系列函数进行字符编码格式转换

  • Post author:
  • Post category:其他


在此处可以看到iconv()系列函数的man手册

iconv(3) – Linux manual page

简单来说,在C/C++编程中,可以使用iconv()系列函数来进行不同字符编码格式之间的字符串的转换,使用时需要给出转换前的字符编码格式和需要转换的字符编码格式。

常用的三个函数接口如下所示:

①iconv_open

#include <iconv.h>

iconv_t

iconv_open

(const char*

tocode

, const char*

fromcode

);

头文件:#include <iconv.h>

函数描述:该函数会为字符编码转换分配一个转换描述符(coversion descriptor),用以在后续的转换过程中使用;

入参:@tocode,转换后的字符编码格式(来自支持的语言列表);@fromcode,转换前的字符编码格式

返回值:返回分配的转换描述符,当出错时,返回-1

②iconv

#include <iconv.h>

size_t

iconv

(iconv_t

cd

, const char* *

inbuf

, size_t *

inbytesleft

, char* *

outbuf

, size_t *

outbytesleft

);

头文件:#include <iconv.h>

函数描述:该函数会从inbuf中读取至多inbytesleft个字节数据,并在outbuf中写入至多outbytesleft个字节数据。执行过程中,一次会处理一个多字节字符;处理过程中*inbuf指针会被不断移动,inbytesleft变量会被不断减少,同时*outbuf和outbytesleft也会不断改变。执行完成后,

*inbuf会被移动到inbuf数据中未处理数据的起始地址

,inbytesleft中会记录未转换完成的字节数,

*outbuf会被移动到空闲地址处

,outbytesleft中会记录剩余的字节空间,方便下一次做循环调用。

入参:@cd,必须是经过iconv_open()函数分配的转换描述符;@inbuf,指向代转换数据的二级指针;@inbytesleft,当次需要转换的字节数;@outbuf,指向转换完数据的二级指针;@outbytesleft,当次用来存储输出数据的字节空间大小

返回值:返回已转换的字符数,当出错时,返回-1并设置errorno

③iconv_close

#include <iconv.h>

int

iconv_close

(iconv_t

cd

);

头文件:#include <iconv.h>

函数描述:回收已分配的转换描述符,结束当前转换工作

入参:@cd,必须是经过iconv_open()函数分配的转换描述符

返回值:0表示调用正常,-1表示调用失败

具体支持的字符编码类型可以在运行环境中使用命令查询:

iconv -l

也可以参考官网记录的语言支持列表



ICONV_OPEN


icon-default.png?t=N4P3
https://www.gnu.org/savannah-checkouts/gnu/libiconv/documentation/libiconv-1.17/iconv_open.3.html


代码示例如下:

部分参考自

https://blog.csdn.net/gerzhougengcheng/article/details/120923984

#include <iconv.h>


int code_convert(const char *from_charset, const char *to_charset, char *inbuf, size_t inlen, char *outbuf, size_t outlen) 
{
    iconv_t cd;
    char **pin = &inbuf;
    char **pout = &outbuf;

    cd = iconv_open(to_charset, from_charset);
    if (cd == 0)
    {
        return -1;
    }

    memset(outbuf, 0, outlen);

    if ((iconv(cd, pin, &inlen, pout, &outlen) == -1)
    {
        iconv_close(cd);
        return -1;
    }
    iconv_close(cd);
    return 0;
}

int u2g(char *inbuf, size_t inlen, char *outbuf, size_t outlen) 
{
    return code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, outlen);
}

int g2u(char *inbuf, size_t inlen, char *outbuf, size_t outlen) 
{
    return code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, outlen);
}

std::string GBKToUTF8(const std::string& strGBK)
{
    int length = strGBK.size()*2+1;

    char *temp = (char*)malloc(sizeof(char)*length);

    if(g2u((char*)strGBK.c_str(),strGBK.size(),temp,length) >= 0)
    {
        std::string str_result;
        str_result.append(temp);
        free(temp);
        return str_result;
    }else
    {
        free(temp);
        return "";
    }
}

std::string UTFtoGBK(const char* utf8)
{
    int length = strlen(utf8);

    char *temp = (char*)malloc(sizeof(char)*length);

    if(u2g((char*)utf8,length,temp,length) >= 0)
    {
        std::string str_result;
        str_result.append(temp);
        free(temp);

        return str_result;
    }else
    {
        free(temp);
        return "";
    }
}



版权声明:本文为weixin_42711661原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。