Ich möchte fehlerhafte UTF-8-Zeichen durch Leerzeichen mit einem Perl-Skript erkennen und ersetzen, während die Daten mit SQL * Loader geladen werden. Wie kann ich das machen?So erkennen Sie fehlerhafte UTF-Zeichen
Antwort
EDIT: (Entfernt wenig über SQL Loader wie es scheint, nicht mehr relevant sein.)
Ein Problem Ausarbeiten sein wird, was als das „Ende“ zählt ein ungültiges UTF-8-Zeichen. Es ist leicht zu sagen, was illegal ist, aber es ist möglicherweise nicht offensichtlich, wo der nächste legale Charakter beginnt.
RFC 3629 beschreibt die Struktur von UTF-8-Zeichen. Wenn Sie sich das ansehen, werden Sie feststellen, dass es ziemlich einfach ist, ungültige Zeichen zu finden, UND dass die nächste Zeichengrenze immer leicht zu finden ist (es ist ein Zeichen < 128, oder eines der "langen Zeichen" Startmarker). mit führenden Bits von 110, 1110 oder 11110).
Aber BKB ist wahrscheinlich richtig - die einfachste Antwort ist es, Perl für Sie tun, obwohl ich nicht sicher bin, was Perl tut, wenn es die falsche utf-8 mit diesem Filter erkennt.
Betrachten Sie Python. Es ermöglicht, Codecs mit benutzerdefinierten Fehlerhandlern zu erweitern, so dass Sie undecodable Bytes mit allem, was Sie möchten, ersetzen können.
import codecs
codecs.register_error('spacer', lambda ex: (u' ', ex.start + 1))
s = 'spam\xb0\xc0eggs\xd0bacon'.decode('utf8', 'spacer')
print s.encode('utf8')
Diese Drucke:
spam eggs bacon
zu finden, wo beginnt das nächste Zeichen sind einfach - das ist eine der sehr coolen Dinge über UTF-8-Design. http://tools.ietf.org/html/rfc3629 –
Einfach nur in gut geformten UTF-8. Stellen Sie sich vor, dass ein doppeltes Blei-Byte eingefügt wird - Sie müssten das erste Vorkommen überspringen. Wenn Sie einfach die UTF-8-Regeln befolgen, scheint das nächste Zeichen mit dem letzten Byte des Zeichens zu beginnen, dessen Vorlaufbyte dupliziert wurde. – MSalters
@MSalters: Das ist die Art von was ich dachte, aber ich war nicht sicher genug von mir :) –