2012-03-07 86 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