Converti in batch i file per la codifica


Risposte:


36

Cygwin o GnuWin32 forniscono strumenti Unix come iconve 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 .


4
Non usare lo stesso nome file di input e output! iconvsembra 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 ...
Niavlys,

1
FYI Questa domanda è taggata con osx e non sembra che nessuno dei comandi convert-all funzioni su Yosemite o El Cap. La versione iconv Apples navi non supporta --verbose o -o, e l'altra sintassi che reindirizza stdout non funziona per qualche motivo e lo invia semplicemente allo stdout normale.
Scott McIntyre,

28

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 conversione da ANSI a UTF tramite la tua prima proposta cancella l'intero contenuto del mio file di testo ...
Acroneos,

@Acroneos: poi hai fatto un errore: l'in-file è IN.txt, il file out è OUT.txt ... in questo modo è impossibile sovrascrivere l'originale. se hai utilizzato lo stesso nome file per IN.txt e OUT.txt, ovviamente sovrascrivi il file da cui stai leggendo.
Akira,

Powershell si convertirà in UTF con BOM. find e iconv potrebbero essere molto più facili.
pparas,

6

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

3

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.


Sembra che non possano convertirsi nella stessa cartella, solo in un'altra cartella di destinazione.
Uwe Keim,

La versione pro consente la conversione sul posto. $ 20 / tre mesi. rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman

Oh, la versione express (gratuita) è inutile - solo "Rileva" utf-8 WITH BOM !! (tutti possono fare quello ). Solo la versione Pro che si rinnova automaticamente ogni 3 mesi a $ 20 al pop, rileverà automaticamente. Il prezzo è alto per un utente non aziendale. E fai attenzione se provi la versione di base e il tuo file è già utf-8 (senza BOM), quindi questo convertitore lo rileverà come ASCII, quindi (ri -) "convertilo" in utf-8, il che potrebbe risultare incomprensibile . Fai attenzione se prima di provare la versione express! Hanno una versione demo per i professionisti che non produce alcun output - perché IMHO inutile non può verificare i risultati prima di acquistare!
SherylHohman,

3

Oneliner utilizzando find, con rilevamento automatico

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-8codifica:

$ 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, shviene utilizzata una sub shell -exec, eseguendo una riga con il -cflag e passando il nome file come argomento posizionale "$1"con -- {}. Nel mezzo, il utf-8file di output è temporaneamente denominato converted.

Il findcomando è molto utile per tale automazione della gestione dei file.

Clicca qui per più a findbizzeffe .


1

iconv -f original_charset -t utf-8 originalfile > newfile

eseguire il comando sopra in per ciclo.





0

Nel mio caso d'uso, avevo bisogno del rilevamento automatico della codifica di input e c'erano molti file con Windows-1250codifica, 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' -- {} \;
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.