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.

War es hilfreich?

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')

Sie können mit isutf8 von der moreutils Sammlung.

$ apt-get install moreutils
$ isutf8 your_file

In einem Shell-Skript, verwenden Sie den --quiet Schalter und überprüfen Sie den Exit-Status, die Null für Dateien, die gelten utf-8.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top