2008-10-15 14 views

Antwort

1

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.

+0

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 –

+2

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

+0

@MSalters: Das ist die Art von was ich dachte, aber ich war nicht sicher genug von mir :) –

1

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.

4

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