Cómo comprobar si un archivo es válido UTF-8?
-
02-07-2019 - |
Pregunta
Estoy de procesamiento de algunos de los archivos de datos que se supone que para ser válida UTF-8 pero no lo son, que hace que el analizador (no bajo mi control) a fallar.Me gustaría añadir una etapa de pre-validación de los datos para UTF-8 y la correcta forma, pero todavía no he encontrado una utilidad para ayudar a hacer esto.
Hay un servicio web en el W3C, que parece estar muerta, y me he encontrado sólo para Windows validación herramienta que los informes no válido archivos UTF-8 pero no se informe de que las líneas o los caracteres a revisión.
Yo sería feliz con una herramienta que puede caer en el uso y (idealmente de la cruz-plataforma), o un rubí/script en perl que puedo hacer parte de mi proceso de carga de datos.
Solución
Usted puede utilizar GNU iconv:
$ iconv -f UTF-8 your_file -o /dev/null; echo $?
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 puede ser convertido con éxito, y 1 si no.Además, se imprimirá el desplazamiento de byte donde se produjo la secuencia de bytes no válida.
Editar:La codificación de salida no tiene que ser especifica, se supone que para ser UTF-8.
Otros consejos
El uso de python y str.codificar|decodificar funciones.
>>> 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 tiene la información solicitada en su .los argumentos de la propiedad.
>>> 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')
Cómo acerca de la gnu iconv la biblioteca?El uso de la función iconv ():"Una secuencia multibyte inválida se encuentra en la entrada.En este caso se establece errno a EILSEQ y devuelve (size_t)(-1).*inbuf está apuntando a la izquierda al principio de la secuencia multibyte inválida."
EDITAR:oh - me perdí la parte donde desea un lenguaje de secuencias de comandos.Pero para el comando de la línea de trabajo, la iconv la utilidad debe validar para usted también.