C语⾔下使⽤iconv函数实现字符编码转换
博客说明:
1.iconv相关函数介绍
iconv命令是⽤来转换⽂件的编码⽅式的(Convert encoding of given files from one encoding to another),⽐如它可以将UTF8编码的转换成
GB18030的编码,反过来也⾏。⼀般linux下包含iconv指令:
格式:iconv -l
转换如下所⽰:
格式:iconv -f from-encoding -t to-encoding inputfile
上⾯调⽤⽅式,会把输出打印在屏幕上,如果要输出到⽂件,可以像下⾯这样
格式:iconv -f from-encoding -t to-encoding inputfile -o outputfile 或重定向 iconv -f from-encoding -t to-encoding inputfile > outputfile
不过,这⾥主要介绍Linux下的iconv开发库,包括iconv_open、iconv、iconv_close等C函数,这些函数可以通过man查看使⽤⽅法,其他博客对这些函数有充分说明,这⾥简单介绍:
iconv_t iconv_open (const char* tocode, const char* fromcode);
此函数返回⼀个句柄cd,即把formcode编码的字符串转换成tocode编码的字符串的转换描述符。
如果发⽣错误返回-1。
size_t iconv (iconv_t cd, const char* * inbuf, size_t * inbytesleft, char* * outbuf, size_t * outbytesleft);
此函数真正⽤于字符转换,cd就是iconv_open返回的句柄,注意iconv会修改传⼊的参数。转换成功iconv返回的是不可逆的字符总数,也就是被替换或是忽略的字符总数,如果⼀切正常,应该返回0,如果转换失败,返回-1。
iconv⽀持的编码格式:
Chinese
EUC-CN, HZ, GBK, CP936, GB18030, EUC-TW, BIG5, CP950, BIG5-HKSCS, BIG5-HKSCS:2004, BIG5-HKSCS:2001, BIG5-HKSCS:1999, ISO-2022-CN, ISO-2022-CN-EXT
Full Unicode
UTF-8
UCS-2, UCS-2BE, UCS-2LE
UCS-4, UCS-4BE, UCS-4LE
UTF-16, UTF-16BE, UTF-16LE
UTF-32, UTF-32BE, UTF-32LE
UTF-7
C99, JAVA
int iconv_close (iconv_t cd);
此函数释放内存空间,成功返回0,否则返回-1。
2.使⽤⽅法举例
c++中string的用法#include <stdlib.h>
#include <stdio.h>
#include <iconv.h>  /* 包含头⽂件 */
#define LOG_BUFFER_MAX                  (1024)
static Int8    gOutBuf[LOG_BUFFER_MAX] = {0};
static Int8    gOutBuf[LOG_BUFFER_MAX] = {0};
/*******************************************************************************
* 函数名  : getGd2312ToUtf8
* 描    述  : 转换编码函数
* 输    ⼊  : - str:
*              : - len:
* 输    出  : ⽆
* 返回值  : CON_SOK  : 成功
*                CON_EFAIL: 失败
*******************************************************************************/
String getGd2312ToUtf8(String str, Uint32L len)
{
Int32 ret = 0;
String outStr = gOutBuf;
Uint32L outLen = sizeof(gOutBuf);
memset(outStr, 0, outLen);
iconv_t cdOpt = iconv_open("UTF-8//IGNORE", "GB18030");  /* GBK就是GB2312扩展版本 GB18030是兼容前两种编码最全 ⽽ANSI是指GB2312 */
ret = iconv(cdOpt, &str, &len, &outStr, &outLen);
if (ret < 0)
{
CON_WARN("iconv function fail!\r\n");
}
iconv_close(cdOpt);
return gOutBuf;
}
3.编译选项注意
编译时需要添加链接选项-liconv,不然会报错误,其次,如果想要去除编译时对中⽂(ANSI格式)的警告,可以添加编译选项-Wno-invalid-source-encoding。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。