2012-03-07 19 views
5

Voglio convertire i dati in altre codifiche in UTF-8. Sono bloccato con i seguenti problemi:Come usare iconv per la conversione utf8?

  1. L'esecuzione del codice allegato mi dà: pointer being freed was not allocated in iconv(). Perché iconv gioca con la mia memoria?
  2. Quando non libero (dst) non si arresta in modo anomalo ma non viene stampato nulla. Nemmeno senza senso. Cosa c'è che non va?

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, i caratteri UTF-8 non richiedono mai più di 6 byte ciascuno. 'len_src * 8' è un overkill. –

risposta

3

preventivo da 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); 

La variabile puntata da outbuf sono aggiornati per puntare al byte l'ultimo byte di dati di uscita convertiti.

è necessario salvare e ripristinare *dst (e possibilmente *src) all'interno vostra funzione utf8().

+0

Thx! Qualche idea sul perché la funzione è stata scritta per modificare i puntatori? Non sembra una buona pratica per me. – ClosedID

+0

Se la conversione non è completa, si ottiene la posizione (sia di input che di output) alla quale la conversione può continuare. Se la funzione accetta 'char *' o ha promesso di non cambiare gli argomenti, è necessario passare un altro argomento per quel tipo di gestione. Lascerò aperta la domanda su quale delle due opzioni sia "migliore" ... – pmg

+0

Stavo cercando di trovare questo bug nel mio codice per settimane. Mi hai salvato. Grazie! –