1. 程式人生 > >解決gb2312與utf-8轉碼問題

解決gb2312與utf-8轉碼問題

{
    iconv_t cd;
    char **pin = &inbuf;
    char **pout = &outbuf;

    cd = iconv_open(to_charset, from_charset);
    if (cd == -1)
    {
        perror("iconv_open:");
        return -1;
    }

    memset(outbuf,0,outlen);
    if (iconv(cd, pin, &inlen, pout, &outlen) == -1)
    {
        //printf("%s: call iconv failed!\n", __FUNCTION__);
        printf("errno=%d\n", errno);
        perror("iconv failed:\n");
        iconv_close(cd);
        return -1;
    }
    iconv_close(cd);
    return 0;
}

static int g2u(char* inbuf, size_t inlen, char* outbuf, size_t outlen)
{
    return code_convert("UTF-8", "GB2312", inbuf, inlen, outbuf, outlen);
}

開發環境為Ubuntu11.10,開發板為ARM開發板,交叉編譯器版本為arm-linux-4.4.3。相同的C源程式,在Ubuntu11.10上能夠正常執行,而在ARM開發板則不能正常執行,呼叫iconv_open("GB2312", "UTF-8") 返回失敗,錯誤資訊為“Invalid argument”。經過查詢資料得知iconv相關函式為libc中的函式,初步分析得出結論為有可能是libc版本中iconv相關函式的版本不同造成的,因此要更新iconv相關函式。更新iconv相關函式有兩種方法:

  1. 第一,更新libc庫;
  2. 更新libiconv庫。

第一種方法更新libc庫比較麻煩,因為我們用的是編譯好的交叉編譯器,這中方法需要重新編譯生成交叉編譯器,並且也需要使用新編譯生成的交叉編譯工具重新編譯應用程式,因此本方法代價太大,採用第二種方法。


第二種方法為只更新libiconv庫,到iconv官網下載最新的庫原始碼包,下載地址為:http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz;解壓後得到libiconv目錄,閱讀該目錄下Readme檔案得出,編譯安裝libiconv庫也有兩種方式: