C語言下使用iconv函式實現字元編碼轉換
阿新 • • 發佈:2019-01-04
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。
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