2012-03-07 84 views
5

我想將其他編碼中的數據轉換爲UTF-8。我有以下問題:如何使用iconv進行utf8轉換?

  1. 執行附加的代碼給我:pointer being freed was not allocated in iconv()。 iconv爲什麼玩我的記憶?
  2. 當我不釋放(dst)它不會崩潰但沒有打印。甚至沒有胡言亂語。 有什麼問題?

void utf8(char **dst, char **src, const char *enc) 
{ 
    iconv_t cd; 
    size_t len_src, 
      len_dst; 

    len_src = strlen(*src); 
    len_dst = len_src * 8; // is that enough for ASCII to UTF8? 

    cd = iconv_open("UTF-8", enc); 

    *dst = (char *)calloc(len_dst+1, 1); 

    iconv(cd, src, &len_src, dst, &len_dst); 
    iconv_close(cd); 
} 

int main(int argc, char **argv) 
{ 
    char *src = "hello world"; 
    char *dst; 

    utf8(&dst, &src, "ASCII"); 
    printf("%s\n", dst); 

    free(dst); 
    return 0; 
} 
+0

FWIW,UTF-8字符每個永遠不會超過6個字節。 'len_src * 8'是一個矯枉過正的問題。 – 2013-03-28 08:53:44

回答

3

報價從iconv() description at POSIX.1-2008

size_t iconv(iconv_t cd, char **restrict inbuf, 
     size_t *restrict inbytesleft, char **restrict outbuf, 
     size_t *restrict outbytesleft); 

變量指向outbuf中應被更新以指向字節轉換後的輸出數據的最後一個字節以下。

您需要保存和恢復*dst(也可能*src)您utf8()函數中。

+0

Thx!任何想法爲什麼函數被寫入來修改指針?對我來說,這看起來不太好。 – ClosedID 2012-03-07 21:02:16

+0

如果轉換未完成,您將獲得轉換可以繼續的位置(包括輸入和輸出)。如果該函數接受'char *'或承諾不更改參數,則需要傳遞另一個參數來進行這種管理。我將留下兩個選項中哪一個更好的問題...... – pmg 2012-03-07 21:08:52

+0

我試圖在我的代碼中發現這個錯誤數週。你救了我。謝謝! – 2013-05-14 13:56:46