2012-03-07 37 views
5

Quiero convertir datos en otras codificaciones a UTF-8. Estoy varado con los siguientes problemas:¿Cómo usar iconv para la conversión de utf8?

  1. Ejecutar el código adjunto me da: pointer being freed was not allocated en iconv(). ¿Por qué iconv juega con mi memoria?
  2. Cuando no lo hago de forma gratuita (dst), no se cuelga pero no se imprime nada. Ni siquiera galimatías. ¿Qué pasa?

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, los caracteres UTF-8 nunca toman más de 6 bytes cada uno. 'len_src * 8' es una exageración. –

Respuesta

3

Presupuesto de 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 variable a la que apunta outbuf se actualizarán para que apunte al siguiente byte del último byte de datos de salida convertidos.

Tendrá que guardar y restaurar *dst (y posiblemente *src) dentro de su función utf8().

+0

¡Thx! ¿Alguna idea de por qué la función fue escrita para modificar los punteros? No me parece una buena práctica. – ClosedID

+0

Si la conversión no es completa, obtiene la posición (tanto de entrada como de salida) en la que puede continuar la conversión. Si la función acepta 'char *' o prometió no cambiar los argumentos, necesitaría pasar otro argumento para ese tipo de gestión. Dejaré abierta la pregunta de cuál de las dos opciones es "mejor" ... – pmg

+0

Estuve tratando de encontrar este error en mi código durante semanas. Me salvaste. ¡Gracias! –

Cuestiones relacionadas