在此处可以看到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
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 "";
}
}