博客说明:
博客内容用于学习与分享,有问题欢迎大家讨论留言。
关于作者:
程序员:杨洪(ellende)
blog: http://blog.csdn.NET/ellende
email: yangh.personal@qq.com
转载请注明出处,引用部分网上博客,若有侵权还请作者联系与我。
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 <stdlib.h>
#include <stdio.h>
#include <iconv.h> /* 包含头文件 */
#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。