C语言下使用iconv函数实现字符编码转换


博客说明:

博客内容用于学习与分享,有问题欢迎大家讨论留言。

关于作者:
程序员:杨洪(ellende)
blog: http://blog.csdn.NET/ellende
email: [email protected]

转载请注明出处,引用部分网上博客,若有侵权还请作者联系与我。



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.使用方法举例
#include
#include
#include  /* 包含头文件 */


#define LOG_BUFFER_MAX                  (1024)
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。




你可能感兴趣的:(嵌入式学习)