So entfernen Sie Nicht-UTF-8-Zeichen aus der Textdatei

84

Ich habe eine Reihe von arabischen, englischen und russischen Dateien, die in utf-8 codiert sind. Beim Versuch, diese Dateien mit einem Perl-Skript zu verarbeiten, wird folgende Fehlermeldung angezeigt:

Malformed UTF-8 character (fatal)

Beim manuellen Überprüfen des Inhalts dieser Dateien fand ich einige seltsame Zeichen in ihnen. Jetzt suche ich nach einer Möglichkeit, diese Zeichen automatisch aus den Dateien zu entfernen.

Gibt es sowieso etwas zu tun?

Hakim
quelle
2
Vielleicht ist es das gleiche wie: stackoverflow.com/questions/7656283/…
Olaf Dietsche
2
Bitte beziehen Sie sich auf diesen Link: unix.stackexchange.com/questions/6516/filtering-invalid-utf8
askmish
4
Was sind Nicht-UTF-8-Zeichen? Alle Zeichen in einer wohlgeformten UTF-8-Zeichenfolge sind UTF-8-Zeichen (tatsächlich Unicode)! Einige von ihnen sind UTF-8 in mehreren aufeinanderfolgenden Bytes codiert ....
Basile Starynkevitch
3
@BasileStarynkevitch: In der Fehlermeldung wird eindeutig angegeben, dass ein fehlerhaftes UTF-8-Zeichen vorliegt. Das bedeutet, dass ein Byte angezeigt wurde, das nicht als Teil einer gültigen UTF-8-Datei angezeigt werden kann. Das ist nicht schwer; Dies kann ein 0xC0- oder 0xC1-Byte oder 0xF5..0xFF oder ein Sequenzierungsproblem mit Bytes sein, das ansonsten gültig wäre.
Jonathan Leffler

Antworten:

156

Dieser Befehl:

iconv -f utf-8 -t utf-8 -c file.txt

Bereinigt Ihre UTF-8-Datei und überspringt alle ungültigen Zeichen.

-f is the source format
-t the target format
-c skips any invalid sequence
Palantir
quelle
11
"iconv -f utf-8 -t utf-8 -c file.txt" auf einem Mac. Bindestrich zwischen 'f' und '8'
Colin
1
Praktischerweise können Sie den Inhalt der Zwischenablage auf einem Mac so transformieren : pbpaste | iconv -f utf-8 -t -utf-8 -c | pbcopy. Ich habe auch einen Alfred-Workflow mit einer globalen Verknüpfung zum Entfernen aller Sonderzeichen durch Targeting erstellt ascii.
Lenar Hoyt
1
Dies erzeugte eine Datei, die für mich völlig leer war. Ich möchte nur alle wissen lassen, dass dies potenziell destruktiv ist, und ihre Datei sichern, bevor ich sie darauf ausführe.
counterbeing
5
iconv -f utf-8 -t ascii//TRANSLITlöste mein Problem. Es konvertiert geschweifte Anführungszeichen in gerade Anführungszeichen.
Colonel Panic
5
-ofür verschiedene Ausgabedateien
Codaamok
0

Ihre Methode muss Byte für Byte lesen und die byteweise Konstruktion von Zeichen vollständig verstehen und schätzen. Die einfachste Methode ist die Verwendung eines Editors, der alles liest, aber nur UTF-8-Zeichen ausgibt. Textpad ist eine Wahl.

Charles KnNell
quelle
iconv ist in cygwin nicht verfügbar. Gibt es eine Möglichkeit, dies unter Windows / Cygwin zu tun? Ich habe eine große XML-Datei (über 100000 Zeilen), in der ungültige Zeichen entfernt werden müssen. Ich interessiere mich nicht für gültige utf-8. Ich habe Notepad ++ auf utf-8 gesetzt, aber selbst nach dem Speichern bekomme ich immer noch Fehler im XML-Parser
mljm
Ubuntu WSL unter Windows kommt mit iconv
Kat Lim Ruiz vor
-4
cat foo.txt | strings -n 8 > bar.txt

wird den Job machen.

atul jha
quelle
10
Nein, dies wird auch viele gültige utf-8-Zeichen töten.
Zack Burt