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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top