Come verificare se un file è UTF-8 valido?
-
02-07-2019 - |
Domanda
Sto elaborando alcuni file di dati che si suppone siano UTF-8 validi ma che non lo sono, il che fa fallire il parser (non sotto il mio controllo). Vorrei aggiungere una fase di pre-validazione dei dati per la buona formazione di UTF-8, ma non ho ancora trovato un'utilità per aiutarci a fare questo.
Esiste un servizio web sul W3C che sembra essere morto e ho trovato una convalida solo per Windows strumento che riporta file UTF-8 non validi ma non riporta quali righe / caratteri correggere.
Sarei contento di uno strumento che posso inserire e utilizzare (idealmente multipiattaforma) o di uno script ruby ??/ perl che posso prendere parte al mio processo di caricamento dei dati.
Soluzione
Puoi usare GNU iconv:
$ iconv -f UTF-8 your_file -o /dev/null; echo $?
O con versioni precedenti di iconv, come su macOS:
$ iconv -f UTF-8 your_file > /dev/null; echo $?
Il comando restituirà 0 se il file può essere convertito correttamente e 1 in caso contrario. Inoltre, stamperà l'offset di byte in cui si è verificata la sequenza di byte non valida.
Modifica : non è necessario specificare la codifica di output, si presuppone che sia UTF-8.
Altri suggerimenti
Usa le funzioni python e 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
L'eccezione generata ha le informazioni richieste nella sua proprietà .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')
Puoi usare isutf8 dalla collezione moreutils .
$ apt-get install moreutils
$ isutf8 your_file
In uno script di shell, utilizzare l'opzione --quiet
e verificare lo stato di uscita, che è zero per i file validi utf-8.
Che ne dici della libreria gnu iconv ? Utilizzo della funzione iconv (): " Nell'input è stata rilevata una sequenza multibyte non valida. In questo caso imposta errno su EILSEQ e restituisce (size_t) (- 1). * inbuf viene lasciato puntato all'inizio della sequenza multibyte non valida. "
EDIT: oh - ho perso la parte in cui vuoi un linguaggio di scripting. Ma per il lavoro da riga di comando, l'utilità iconv dovrebbe convalida anche per te.