1. 程式人生 > >C語言下使用iconv函式實現字元編碼轉換

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.使用方法舉例
#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。