一、字符編碼識別
1、簡介
uchardet是一個開源的用於文本編碼檢測的C語言庫,其功能模塊是用C++實現的,通過一定數量的字符樣本獨立的分析出文本的編碼,當前已經支持UTF-8/GB13080/BIG5等共30多種編碼。
參考:
2、安裝
3、實例
example1.c
#include <stdio.h> #include <uchardet/uchardet.h> /* 樣本數量 */ #define NUMBER_OF_SAMPLES (2048) int main(int argc, char* argv[]) { FILE* file; char buf[NUMBER_OF_SAMPLES]; int len; uchardet_t ud; /* 打開被檢測文本文件,並讀取一定數量的樣本字符 */ file = fopen("gb18030.txt", "rt"); len = fread(buf, sizeof(char), NUMBER_OF_SAMPLES, file); fclose(file); /* 通過樣本字符分析文本編碼 */ ud = uchardet_new(); if(uchardet_handle_data(ud, buf, len) != 0) /* 如果樣本字符不夠,那么有可能導致分析失敗 */ { printf("分析編碼失敗!\n"); return -1; } uchardet_data_end(ud); printf("文本的編碼方式是%s。\n", uchardet_get_charset(ud)); /* 獲取並打印文本編碼 */ uchardet_delete(ud); return 0; }
編譯
g++ -g -o example1 example1.c -I../src -L../src -static -luchardet
運行
二、字符編碼轉換
1、簡介
由於歷史原因,國際化的文字常常由於語言或者國家的原因使用不同的編碼。libiconv庫為需要做轉換的應用提供了一個iconv()的函數,以實現一個字符編碼到另一個字符編碼的轉換。
2、安裝
3、API
iconv函數族有三個函數,原型如下:
iconv_t iconv_open(const char *tocode, const char *fromcode);
此函數說明將要進行哪兩種編碼的轉換,tocode是目標編碼,fromcode是原編碼,該函數返回一個轉換句柄,供以下兩個函數使用。
size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
此函數從inbuf中讀取字符,轉換后輸出到outbuf中,inbytesleft用以記錄還未轉換的字符數,outbytesleft用以記錄輸出緩沖的剩余空間。
int iconv_close(iconv_t cd);
此函數用於關閉轉換句柄,釋放資源。
4、實例
參考:
example1.c
#include<stdio.h> #include <string.h> #include <iconv.h> int ChangeCode( const char* pFromCode, const char* pToCode, const char* pInBuf, size_t* iInLen, char* pOutBuf, size_t* iOutLen ); int main( int argc, char* argv[] ) { char sInBuf[100]; char sOutBuf[100]; size_t iInLen = 0; size_t iOutLen = 100; int iRet; strcpy( sInBuf, "測試 Test Source" ); puts(sInBuf); memset( sOutBuf, 0x00, 100 ); iInLen = strlen( sInBuf ); iRet = ChangeCode( "GBK", "UTF-16", sInBuf, &iInLen, sOutBuf, &iOutLen ); puts(sOutBuf); iRet = ChangeCode( "UTF-16", "GBK", sOutBuf, &iOutLen , sOutBuf, &iOutLen ); puts(sOutBuf); return 0; } int ChangeCode( const char* pFromCode, const char* pToCode, const char* pInBuf, size_t* iInLen, char* pOutBuf, size_t* iOutLen ) { int iRet; //打開字符集轉換 iconv_t hIconv = iconv_open( pToCode, pFromCode ); if ( -1 == (int)hIconv ) { return -1;//打開失敗,可能不支持的字符集 } //開始轉換 iRet = iconv( hIconv, (const char**)(&pInBuf), iInLen, (char**)(&pOutBuf), iOutLen ); //關閉字符集轉換 iconv_close( hIconv ); return iRet; }
編譯
gcc -g -o example1 example1.c -liconv
運行


