Come rimuovere i caratteri non UTF-8 dal file di testo


86

Ho un sacco di file in arabo, inglese, russo che sono codificati in utf-8. Cercando di elaborare questi file utilizzando uno script Perl, ottengo questo errore:

Malformed UTF-8 character (fatal)

Controllando manualmente il contenuto di questi file, ho trovato alcuni strani caratteri in essi. Ora sto cercando un modo per rimuovere automaticamente questi caratteri dai file.

C'è qualche modo per farlo?


2
Forse è lo stesso di questo: stackoverflow.com/questions/7656283/…
Olaf Dietsche


4
Cosa sono i caratteri non UTF-8? Tutti i caratteri in una stringa UTF-8 ben formata sono caratteri UTF-8 (in realtà Unicode)! Alcuni di loro sono codificati UTF-8 in diversi byte consecutivi ...
Basile Starynkevitch

3
@BasileStarynkevitch: il messaggio di errore indica chiaramente che è presente un carattere UTF-8 non valido. Ciò significa che è apparso un byte che non può apparire come parte di un file UTF-8 valido. Non è difficile; potrebbe essere un byte 0xC0 o 0xC1, o 0xF5..0xFF, o un problema di sequenza con byte che altrimenti sarebbero validi.
Jonathan Leffler

Risposte:


159

Questo comando:

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

ripulirà il tuo file UTF-8, saltando tutti i caratteri non validi.

-f is the source format
-t the target format
-c skips any invalid sequence

11
"iconv -f utf-8 -t utf-8 -c file.txt" su un Mac. trattino tra "f" e "8"
Colin

1
Comodamente è possibile trasformare il contenuto degli appunti su un Mac che fanno così: pbpaste | iconv -f utf-8 -t -utf-8 -c | pbcopy. Ho anche creato un flusso di lavoro Alfred con una scorciatoia globale per eliminare tutti i caratteri speciali mirando ascii.
Lenar Hoyt

1
Questo ha prodotto un file che era completamente vuoto per me. Voglio solo far sapere a tutti che questo è potenzialmente distruttivo e fare il backup del loro file prima di eseguirlo su di esso.
counterbeing

5
iconv -f utf-8 -t ascii//TRANSLITha risolto il mio problema. Converte virgolette ricci in virgolette semplici.
Colonel Panic

5
-oper file di output diversi
codaamok

0

Il tuo metodo deve leggere byte per byte e comprendere appieno e apprezzare la costruzione saggia dei caratteri byte. Il metodo più semplice è usare un editor che leggerà qualsiasi cosa ma emetterà solo caratteri UTF-8. Textpad è una scelta.


iconv non è disponibile in cygwin. C'è un modo per farlo su Windows / Cygwin? Ho un file XML di grandi dimensioni (100000+ righe) che richiede l'eliminazione dei caratteri non validi. Non mi interessa un utf-8 valido. Ho impostato Notepad ++ su utf-8, ma anche dopo averlo salvato da lì ricevo ancora errori nel parser XML
mljm

ubuntu WSL su Windows viene fornito con iconv
Kat Lim Ruiz

-4
cat foo.txt | strings -n 8 > bar.txt

farà il lavoro.


10
No, questo ucciderà anche molti caratteri utf-8 validi.
Zack Burt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.