iconv Linux下編碼轉換

iconv Linux下編碼轉換

知識標籤:linux, iconv, 編碼


有時程序運行時會用到編碼轉換,這時就用到iconv的3個函數
特寫了一個測試小代碼以作備忘

iconv3個函數原型

       iconv_t iconv_open(const char *tocode, const char *fromcode);
       size_t iconv(iconv_t cd,
                    char **inbuf, size_t *inbytesleft,
                    char **outbuf, size_t *outbytesleft);
       int iconv_close(iconv_t cd);

code

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<iconv.h>

void convert(char* left, size_t sizeleft, char* right, size_t sizeright)
{
    printf("left: %s\n", left);
    printf("rightleft: %ld\n", sizeleft);
    printf("right: %s\n", right);
    printf("sizeright: %ld\n", sizeright);
    printf("--------------------------\n");

    iconv_t cd = iconv_open("gbk", "utf-8");
    if((iconv_t)-1 == cd)
    {
        std::cout << "cd error !" << std::endl;
        return;
    }

    iconv(cd, (char**)&left, (size_t*)&sizeleft, (char**)&right, (size_t*)&sizeright);

    printf("left: %s\n", left);
    printf("rightleft: %ld\n", sizeleft);
    printf("right: %s\n", right);
    printf("sizeright: %ld\n", sizeright);

    iconv_close(cd);
}
int main(void)
{
    char buf[1024];
    size_t size_buf = sizeof(buf);
    //字符串一定要初始化爲0,養成習慣,否則總是出現莫名錯誤
    memset(buf, 0, size_buf);
    strcpy(buf, "星期二我是中國人hello");
    size_t len_buf = strlen(buf);

    char buf2[1024];
    size_t size_buf2 = sizeof(buf2);
    memset(buf2, 0, size_buf2);

    //第二參數應該是緩存區的大小,不應該是緩存區中字符長度
    //應該是size_buf,不應該是len_buf
    convert(buf, size_buf, buf2, size_buf2);

    return 0;
}

結果

終端編碼設置爲utf-8的結果:
這裏寫圖片描述

終端編碼設置爲gbk的結果:
這裏寫圖片描述

總結

  • buf一定要memset(buf, 0, sizeof(buf))
  • size_buf一定要是緩存區的大小,不應該是緩存區中字符長度
  • 三步:1.iconv_open獲取描述符 2.iconv轉碼 3.iconv_close關閉描述符
  • iconv轉碼後轉碼的結果保存在buf裏面,而不是buf2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章