2012-03-07 3 views
5

Я хочу преобразовать данные в другие кодировки в UTF-8. Я столкнулся со следующими проблемами:Как использовать iconv для преобразования utf8?

  1. Выполнение прилагаемого кода дает мне: pointer being freed was not allocated в 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' является излишним. –

ответ

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

+0

Если преобразование не завершено, вы получаете позицию (как входную, так и выходную), при которой преобразование может продолжаться. Если функция приняла 'char *' или обещала не изменять аргументы, вам нужно будет передать другой аргумент для такого управления. Я оставлю открытым вопрос о том, какой из двух вариантов «лучше» ... – pmg

+0

Я пытался найти эту ошибку в своем коде в течение нескольких недель. Вы спасли меня. Благодаря! –

Смежные вопросы