Wie kann man überprüfen, ob eine Datei gültige UTF-8?
-
02-07-2019 - |
Frage
Ich bin die Verarbeitung einiger Datendateien, die gültige UTF-8, aber nicht, sein sollen, die den Parser verursacht (nicht unter meiner Kontrolle) zum Scheitern verurteilt. Ich möchte eine Phase der Pre-Validierung der Daten für UTF-8 Wohlgeformtheits- hinzuzufügen, aber ich habe noch nicht ein Dienstprogramm gefunden zu helfen, dies zu tun.
Es gibt eine Webservice bei W3C, das zu sein scheint tot, und ich habe eine Windows-only-Validierung Werkzeug dass Berichte ungültige UTF-8-Dateien aber berichtet nicht, welche Zeilen / Zeichen zu beheben.
würde ich entweder mit einem Werkzeug glücklich sein kann mir falle in und verwende (idealerweise Cross-Plattform) oder einen Rubin / Perl-Skript ich einen Teil meines Datenladeprozesses machen.
Lösung
Sie können GNU iconv verwenden:
$ iconv -f UTF-8 your_file -o /dev/null; echo $?
oder mit älteren Versionen von iconv, wie auf macOS:
$ iconv -f UTF-8 your_file > /dev/null; echo $?
Der Befehl 0 zurück, wenn die Datei erfolgreich konvertiert werden kann, und 1, wenn nicht. Darüber hinaus wird es Offset aus dem Byte drucken, wo die ungültige Bytefolge aufgetreten.
Bearbeiten :. Die Ausgabecodierung muss nicht angegeben wird, wird angenommen, UTF-8 sein
Andere Tipps
Mit Python und str.encode |. Dekodierungsfunktionen
>>> 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
Die geworfene Ausnahme hat die Informationen in seiner .args Eigenschaft angefordert.
>>> 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')
Wie über die Gnu iconv Bibliothek? Mit Hilfe die iconv () Funktion: „Eine ungültige Multibyte-Sequenz in der Eingabe angetroffen wird In diesem Fall ist es errno auf EILSEQ setzt und kehrt (size_t) (- 1) * INBUF links ist zu Beginn der ungültigen Multibyte-Sequenz zeigt... „
EDIT: oh - Ich habe den Teil, in dem Sie eine Skriptsprache werden sollen. Aber für Kommandozeilen-Arbeit, die iconv Dienstprogramm sollte validieren auch für Sie.