C語言字符編碼處理


一、字符編碼識別

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

運行

image

 

二、字符編碼轉換

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

運行

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM