validator utf8 online descifrar codificador charset validation utf-8 internationalization

validation - utf8 - utf 8 to ascii



¿Cómo verificar si un archivo es válido UTF-8? (5)

¿Qué tal la biblioteca gnu iconv ? Usando la función iconv (): "Se encuentra una secuencia multibyte no válida en la entrada. En este caso, establece errno en EILSEQ y devuelve (size_t) (- 1). * Inbuf queda apuntando al comienzo de la secuencia multibyte no válida. "

EDITAR: oh - me perdí la parte en la que desea un lenguaje de scripting. Pero para el trabajo de línea de comando, la utilidad iconv debe validar para usted.

Estoy procesando algunos archivos de datos que se supone que son UTF-8 válidos pero no lo son, lo que hace que el analizador (que no estoy bajo mi control) falle. Me gustaría agregar una etapa de validación previa de los datos para la formación correcta de UTF-8, pero aún no he encontrado una utilidad que me ayude a hacer esto.

Hay un servicio web en W3C que parece estar muerto, y he encontrado una tool validación solo de Windows que informa archivos UTF-8 no válidos pero no informa qué líneas / caracteres corregir.

Estaría contento con una herramienta que pueda agregar y usar (idealmente multiplataforma), o una secuencia de comandos ruby ​​/ perl que pueda formar parte de mi proceso de carga de datos.


El siguiente código de C ++ se basa en uno publicado en muchos sitios a través de Internet. Corregí el error en el código original y agregué la posibilidad de recuperar tanto la posición del carácter no válido como el carácter no válido.

///Returns -1 if string is valid. Invalid character is put to ch. int getInvalidUtf8SymbolPosition(const unsigned char *input, unsigned char &ch) { int nb, na; const unsigned char *c = input; for (c = input; *c; c += (nb + 1)) { if (!(*c & 0x80)) nb = 0; else if ((*c & 0xc0) == 0x80) { ch = *c; return (int)c - (int)input; } else if ((*c & 0xe0) == 0xc0) nb = 1; else if ((*c & 0xf0) == 0xe0) nb = 2; else if ((*c & 0xf8) == 0xf0) nb = 3; else if ((*c & 0xfc) == 0xf8) nb = 4; else if ((*c & 0xfe) == 0xfc) nb = 5; na = nb; while (na-- > 0) if ((*(c + nb) & 0xc0) != 0x80) { ch = *(c + nb); return (int)(c + nb) - (int)input; } } return -1; }


Puede usar isutf8 de la colección moreutils .

$ apt-get install moreutils $ isutf8 your_file

En un script de shell, use el interruptor --quiet y verifique el estado de salida, que es cero para los archivos que son válidos para utf-8.


Puedes usar GNU iconv:

$ iconv -f UTF-8 your_file -o /dev/null

O con versiones anteriores de iconv, como en macOS:

$ iconv -f UTF-8 your_file > /dev/null; echo $?

El comando devolverá 0 si el archivo se puede convertir con éxito y 1 si no. Además, imprimirá la compensación de bytes donde se produjo la secuencia de bytes no válidos.

Editar : La codificación de salida no tiene que ser especificada, se supondrá que es UTF-8.


Utilice las funciones python y str.encode | decode.

>>> a="γεια" >>> a ''/xce/xb3/xce/xb5/xce/xb9/xce/xb1'' >>> b=''/xce/xb3/xce/xb5/xce/xb9/xff/xb1'' # note second-to-last char changed >>> print b.decode("utf_8") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.5/encodings/utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: ''utf8'' codec can''t decode byte 0xff in position 6: unexpected code byte

La excepción lanzada tiene la información solicitada en su propiedad .args.

>>> try: print b.decode("utf_8") ... except UnicodeDecodeError, exc: pass ... >>> exc UnicodeDecodeError(''utf8'', ''/xce/xb3/xce/xb5/xce/xb9/xff/xb1'', 6, 7, ''unexpected code byte'') >>> exc.args (''utf8'', ''/xce/xb3/xce/xb5/xce/xb9/xff/xb1'', 6, 7, ''unexpected code byte'')