Come posso convertire in batch i file in una directory per la loro codifica (ad es. ANSI-> UTF-8) con un comando o uno strumento?
Per i singoli file aiuta un editor, ma come fare il lavoro dei file di massa?
Come posso convertire in batch i file in una directory per la loro codifica (ad es. ANSI-> UTF-8) con un comando o uno strumento?
Per i singoli file aiuta un editor, ma come fare il lavoro dei file di massa?
Risposte:
Cygwin o GnuWin32 forniscono strumenti Unix come iconv
e dos2unix
(e unix2dos
). Sotto Unix / Linux / Cygwin, ti consigliamo di utilizzare "windows-1252" come codifica anziché ANSI (vedi sotto). (A meno che tu non sappia che il tuo sistema sta usando una tabella codici diversa da 1252 come tabella codici predefinita, nel qual caso dovrai dire a iconv la tabella codici corretta da cui tradurre.)
Converti da uno ( -f
) all'altro ( -t
) con:
$ iconv -f windows-1252 -t utf-8 infile > outfile
O in una forma trova e conquista:
## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;
In alternativa:
## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;
Questa domanda è stata posta molte volte su questo sito, quindi ecco alcune informazioni aggiuntive su "ANSI". In una risposta a una domanda correlata, CesarB menziona :
Esistono diverse codifiche che si chiamano "ANSI" in Windows. In effetti, ANSI è un termine improprio . iconv non ha modo di indovinare quale desideri.
La codifica ANSI è la codifica utilizzata dalle funzioni "A" nell'API di Windows (le funzioni "W" utilizzano UTF-16). A quale codifica corrisponde di solito dipende dalla lingua del tuo sistema Windows. Il più comune è CP 1252 (noto anche come Windows-1252). Quindi, quando l'editor dice ANSI, significa "qualunque sia la funzione API utilizzata come codifica ANSI predefinita", che è la codifica non Unicode predefinita utilizzata nel sistema (e quindi di solito quella utilizzata per i file di testo).
La pagina a cui si collega fornisce questa notizia storica (citata da un Microsoft PDF ) sulle origini di CP 1252 e ISO-8859-1, un'altra codifica spesso utilizzata:
[...] questo deriva dal fatto che la tabella codici di Windows 1252 era originariamente basata su una bozza ANSI, che divenne lo standard ISO 8859-1. Tuttavia, aggiungendo i punti di codice all'intervallo riservato ai codici di controllo nello standard ISO, la tabella codici Windows 1252 e le pagine codici Windows successive originariamente basate sulla serie ISO 8859-x si discostavano dalla ISO. Ad oggi, non è raro che la comunità di sviluppo, sia all'interno che all'esterno di Microsoft, confonda la tabella codici 8859-1 con Windows 1252, oltre a vedere "ANSI" o "A" utilizzati per indicare il supporto della tabella codici Windows .
iconv
sembra troncare i file a 32.768 byte se superano questa dimensione. Mentre scrive nel file da cui sta cercando di leggere, riesce a fare il lavoro se il file è abbastanza piccolo, altrimenti tronca il file senza alcun preavviso ...
con PowerShell puoi fare qualcosa del genere:
% get-content IN.txt | out-file -encoding ENC -filepath OUT.txt
mentre ENC è qualcosa come unicode, ascii, utf8, utf32. checkout 'help out-file'.
per convertire tutti i file * .txt in una directory in utf8 fare qualcosa del genere:
% foreach($i in ls -name DIR/*.txt) { \
get-content DIR/$i | \
out-file -encoding utf8 -filepath DIR2/$i \
}
che crea una versione convertita di ogni file .txt in DIR2.
EDIT: per sostituire i file in tutte le sottodirectory utilizzare:
% foreach($i in ls -recurse -filter "*.java") {
$temp = get-content $i.fullname
out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}
La pagina di Wikipedia su newline ha una sezione sulle utility di conversione .
Questa sembra la soluzione migliore per una conversione utilizzando solo gli strumenti forniti da Windows con:
TYPE unix_file | FIND "" /V > dos_file
UTFCast è un convertitore Unicode per Windows che supporta la modalità batch. Sto usando la versione a pagamento e mi sento abbastanza a mio agio.
UTFCast è un convertitore Unicode che ti consente di convertire in batch tutti i file di testo in codifiche UTF con un solo clic del mouse. Puoi usarlo per convertire una directory piena di file di testo in codifiche UTF tra cui UTF-8, UTF-16 e UTF-32 in una directory di output, mantenendo la struttura della directory dei file originali. Non importa nemmeno se il tuo file di testo ha un'estensione diversa, UTFCast può rilevare automaticamente i file di testo e convertirli.
La codifica dei caratteri di tutti i file di testo corrispondenti viene rilevata automaticamente e tutti i file di testo corrispondenti vengono convertiti in utf-8
codifica:
$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;
Per eseguire questi passaggi, sh
viene utilizzata una sub shell -exec
, eseguendo una riga con il -c
flag e passando il nome file come argomento posizionale "$1"
con -- {}
. Nel mezzo, il utf-8
file di output è temporaneamente denominato converted
.
Il find
comando è molto utile per tale automazione della gestione dei file.
Clicca qui per più a find
bizzeffe .
iconv -f original_charset -t utf-8 originalfile > newfile
eseguire il comando sopra in per ciclo.
Usa questo script Python: https://github.com/goerz/convert_encoding.py Funziona su qualsiasi piattaforma. Richiede Python 2.7.
C'è dos2unix
su unix.
C'era un altro strumento simile per Windows ( un altro riferimento qui ).
Come posso convertire file di testo Unix e Windows? ha qualche altro trucco
dos2unix
è utile per convertire le interruzioni di riga , ma l'OP sta cercando la conversione delle codifiche dei caratteri.
Puoi usare EncodingMaster . È gratuito, ha una versione per Windows, Linux e Mac OS X e funziona davvero bene.
Nel mio caso d'uso, avevo bisogno del rilevamento automatico della codifica di input e c'erano molti file con Windows-1250
codifica, per i quali file -bi <FILE>
ritorna il comando charset=unknown-8bit
. Questo parametro non è valido per iconv
.
Ho avuto i migliori risultati con enca .
Converti tutti i file con estensione txt in utf-8
find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;