Wie kann ich bereinigen ungültige UTF-8 in Perl?

Mein Perl-Programm nimmt text aus einer Datei als Eingabe, wickelt es in einigen XML-und gibt es auf STDOUT aus. Der Eingang ist nominell UTF-8, aber manchmal hat junk eingefügt. Ich müssen zu bereinigen, die Ausgabe, dass kein Ungültiger UTF-8-Oktetten emittiert werden, da sonst die nachgeschalteten Verbraucher (Sphinx) wird sprengen.

Zumindest würde ich gerne wissen wenn die Daten ungültig sind, so kann ich vermeiden, weitergeben; im Idealfall konnte ich entfernen, nur der säumige bytes. Jedoch, um alle fatalisms finde ich nicht so Recht, mich dort mit perl 5.12 (FWIW, use v5.12; use warnings qw( FATAL utf8 ); ist in-Effekt).

Bin ich speziell Probleme mit der Reihenfolge "\xFE\xBF\xBE". Wenn ich eine Datei erstellen, die nur diese drei bytes (perl -e 'print "\xEF\xBF\xBE"' > bad.txt), versuchen, Lesen Sie die Datei mit dem Modus :encoding(UTF-8) Fehler mit utf8 "\xFFFE" does not map to Unicode, aber nur unter 5.14.0. 5.12.3 und früher sind gut zu Lesen und später zu schreiben, dass die Sequenz. Ich bin mir nicht sicher, wo es immer die \xFFFE (illegales reverse-BOM) aus, aber zumindest eine Beschwerde ist im Einklang mit der Sphinx.

Leider decode_utf8("\xEF\xBF\xBE", 1) verursacht keine Fehler unter 5.12 oder 5.14. Ich würde es vorziehen, eine Nachweismethode, die nicht verlangen, eine codierte I/O-Schicht, wie das wird nur lassen Sie mich mit einer Fehlermeldung und keine Möglichkeit zu desinfizieren, die raw-Bytes.

Ich bin sicher, es gibt mehr Sequenzen, die ich ansprechen müssen, sondern einfach die Handhabung dieser wäre ein Anfang. Also meine Fragen sind: kann ich zuverlässig erkennen, diese Art von problem, die Daten mit einem perl-bevor 5.14? Was die substitution von routine kann in der Regel bereinigen, fast-UTF-8 in die strengen UTF-8?

Schreibe einen Kommentar