Il modo migliore per convertire file di testo tra set di caratteri?


526

Qual è lo strumento o il metodo più veloce e semplice per convertire i file di testo tra set di caratteri?

In particolare, devo convertire da UTF-8 a ISO-8859-15 e viceversa.

Tutto va bene: una riga nel tuo linguaggio di scripting preferito, strumenti da riga di comando o altre utilità per sistemi operativi, siti Web, ecc.

Le migliori soluzioni finora:

Su Linux / UNIX / OS X / cygwin:

  • Gnu iconv suggerito da Troels Arvin è meglio usato come filtro . Sembra essere universalmente disponibile. Esempio:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    Come sottolineato da Ben , esiste un convertitore online che utilizza iconv .

  • La ricodifica Gnu ( manuale ) suggerita da Cheekysoft convertirà uno o più file sul posto . Esempio:

    $ recode UTF8..ISO-8859-15 in.txt
    

    Questo utilizza alias più brevi:

    $ recode utf8..l9 in.txt
    

    Recode supporta anche superfici che possono essere utilizzate per la conversione tra diversi tipi di fine linea e codifiche:

    Convertire nuove righe da LF (Unix) a CR-LF (DOS):

    $ recode ../CR-LF in.txt
    

    File di codifica Base64:

    $ recode ../Base64 in.txt
    

    Puoi anche combinarli.

    Convertire un file UTF8 codificato Base64 con terminazioni di linea Unix in un file latino 1 codificato Base64 con terminazioni di riga Dos:

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

Su Windows con Powershell ( Jay Bazuzi ):

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (Nessun supporto ISO-8859-15 però; afferma che i set di caratteri supportati sono unicode, utf7, utf8, utf32, ascii, bigendianunicode, default e oem.)

modificare

Intendi il supporto iso-8859-1? L'uso di "String" fa questo ad es. Per viceversa

gc -en string in.txt | Out-File -en utf8 out.txt

Nota: i possibili valori di enumerazione sono "Unknown, String, Unicode, Byte, BigEndianUnicode, UTF8, UTF7, Ascii".


Ho provato gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlma converte il file in utf-8 ma poi è vuoto! Notepad ++ dice che il file è in formato Ansi ma leggendo come ho capito non è nemmeno un set di caratteri valido ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

2
Basta trovare questo alla ricerca di una risposta a una domanda correlata: un ottimo riassunto! Ho pensato che valesse la pena aggiungere che recodefungerà anche da filtro se non si passa alcun nome di file, ad esempio:recode utf8..l9 < in.txt > out.txt
Jez

iconv.com/iconv.htm sembra essere morto per me? (timeout)
Andrew Newby,

2
Se si utilizza enca, non è necessario specificare la codifica di input. E 'abbastanza spesso solo per specificare la lingua: enca -L ru -x utf8 FILE.TXT.
Alexander Pozdneev,

1
In realtà, iconv ha funzionato molto meglio come convertitore sul posto anziché come filtro. Convertire un file con oltre 2 milioni di righe usando iconv -f UTF-32 -t UTF-8 input.csv > output.csvsolo circa settecentomila righe salvate, solo un terzo. Utilizzando la versione sul posto iconv -f UTF-32 -t UTF-8 file.csvconvertiti con successo tutti i 2 milioni di righe in più.
Nicolay77,

Risposte:


246

Approccio di utilità autonomo

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

Non è necessario specificare nessuno di questi argomenti. Per impostazione predefinita, saranno le impostazioni internazionali correnti, che di solito sono UTF-8.


4
Per chiunque non sia disponibile per le versioni non-dash non disponibili, sembra che le versioni OSV (e forse tutte le BSD) di iconv non supportino gli alias non-dash per le varie codifiche UTF- *. iconv -l | grep UTFti dirà tutte le codifiche correlate a UTF supportate dalla tua copia di iconv.
coredumperror,

14
Non conosci la codifica del tuo file di input? Utilizzare chardet in.txtper generare una migliore ipotesi. Il risultato può essere utilizzato come ENCODING in iconv -f ENCODING.
Spezzatino il

4
Prevenire l'uscita a caratteri non validi (evitando illegal input sequence at positioni messaggi), e sostituire i caratteri "strano" con personaggi "simili": iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt.
Knb

Mi piace perché è standard sulla maggior parte delle piattaforme NIX. Ma anche vedere l'opzione di comando VIM (alias: ex) qui di seguito . Informazioni aggiuntive: (1) (probabilmente) non è necessario specificare l' -fopzione (da) con iconv. (2) il file --mime-encoding <file/s>comando può aiutarti a capire la codifica in primo luogo.
13

1
FWIW il filecomando ha riportato la mia fonte come UTF-16 Little Endian; in esecuzione iconv -f UTF-16 -t UTF-8...trasformato in modo errato in ASCII, ho dovuto specificare esplicitamente iconv -f UTF-16LE...per l'output UTF-8
Platone

90

Prova VIM

Se hai vimpuoi usare questo:

Non testato per ogni codifica.

La parte interessante di questo è che non devi conoscere la codifica sorgente

vim +"set nobomb | set fenc=utf8 | x" filename.txt

Tenere presente che questo comando modifica direttamente il file


Parte spiegazione!

  1. +: Usato da vim per inserire direttamente il comando all'apertura di un file. Solitamente utilizzato per aprire un file su una riga specifica:vim +14 file.txt
  2. |: Separatore di più comandi (come ;in bash)
  3. set nobomb : nessuna distinta base utf-8
  4. set fenc=utf8: Imposta la nuova codifica sul collegamento doc utf-8
  5. x : Salva e chiudi il file
  6. filename.txt : percorso del file
  7. ": i qotes sono qui a causa delle pipe. (altrimenti bash li userà come bash pipe)

Abbastanza bello, ma un po 'lento. C'è un modo per cambiare questo per convertire un numero di file contemporaneamente (risparmiando così sui costi di inizializzazione di Vim)?
DomQ

Grazie per la spiegazione! Stavo attraversando un momento difficile con l'inizio del file fino a quando non ho letto l'impostazione della bomba / nobomb.
jjwdesign,

1
np, inoltre puoi visualizzare il bom se lo usi vim -bohead file.txt|cat -e
Boop

1
per esempio:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
Gabriel

Ho usato questo per convertire la codifica dei file CSV ed ero davvero entusiasta quando ho visto che il set di caratteri era davvero cambiato. Sfortunatamente, quando sono andato a caricare il file in MySQL, aveva un numero di colonne diverso da quello che aveva prima di eseguire il comando vim. Ti chiedi se sarebbe possibile semplicemente aprire il file, convertire la codifica e salvare / chiudere il file lasciando tutti gli altri contenuti del file uguali?
NightOwlPrgmr

39

Sotto Linux è possibile utilizzare il comando recode molto potente per provare a convertire tra i diversi set di caratteri e qualsiasi problema di fine riga. recode -l ti mostrerà tutti i formati e le codifiche tra cui lo strumento può convertire. È probabile che sia un elenco MOLTO lungo.


Come si converte LF? C'è /CRe /CR-LFma no/LF
Aaron Franke il


20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

La versione più breve, se si può presumere che la DBA di input sia corretta:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt

1
Ecco una versione più breve che funziona meglio. gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Larry Battle,

@LarryBattle: come Set-Contentfunziona meglio di Out-File?
Jay Bazuzi

...Oh. Immagino siano quasi la stessa cosa. Ho avuto problemi nell'eseguire il tuo esempio perché supponevo che entrambe le versioni usassero lo stesso file-utf8.txtfile per l'input dato che avevano entrambi lo stesso file di output di file-utf7.txt.
Larry Battle

Sarebbe davvero fantastico, tranne per il fatto che non supporta UTF16. Supporta UTF32, ma non UTF16! Non avrei bisogno di convertire i file, tranne per il fatto che un sacco di software Microsoft (fe SQL server bcp) insiste su UTF16 - e quindi la loro utilità non si convertirà in esso. A dir poco interessante.
Noah,

Ho provato gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlma converte il file in utf-8 ma poi è vuoto! Notepad ++ dice che il file è in formato Ansi ma leggendo come ho capito non è nemmeno un set di caratteri valido ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

16

Prova la funzione iconv Bash

Ho inserito questo in .bashrc:

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

..per poter convertire i file in questo modo:

utf8 MyClass.java

8
è meglio usare tmp = $ (mktmp) per creare un file temporaneo. Inoltre, la linea con rm è ridondante.
LMZ,

1
puoi completare questa funzione con il formato di input di rilevamento automatico?
mlibre,

3
attenzione, questa funzione elimina il file di input senza verificare che la chiamata iconv abbia avuto esito positivo.
philwalk,

Ciò modifica il contenuto del file di testo. Ho eseguito questo su un UTF-8 con la distinta base in attesa di estrarre un UTF-8 senza file BOM, ma è stato anteposto all'inizio del file.
Aaron Franke,

14

Prova Notepad ++

Su Windows sono stato in grado di utilizzare Notepad ++ per eseguire la conversione da ISO-8859-1 a UTF-8 . Clicca "Encoding"e poi "Convert to UTF-8".


13

Oneliner utilizzando find, con rilevamento automatico del set di caratteri

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 l'indicatore -ce passando il nome file come argomento posizionale "$1"con -- {}. Nel mezzo, il utf-8file di output è temporaneamente denominato converted.

Per cui file -bisignifica:

  • -b, --brief Non anteporre nomi di file alle righe di output (modalità breve).

  • -i, --mime Fa sì che il comando file generi output stringhe di tipo mime piuttosto che quelle più tradizionali leggibili dall'uomo. Così può dire per esempio text/plain; charset=us-asciipiuttosto che ASCII text. Il sedcomando lo taglia solo us-asciicome richiesto da iconv.

Il findcomando è molto utile per tale automazione della gestione dei file. Clicca qui per più a findbizzeffe .


3
Ho dovuto adattare un po 'questa soluzione per lavorare su Mac OS X, almeno nella mia versione. find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
Brian J. Miller,

1
Il tuo codice ha funzionato anche su Windows 7 con MinGW-w64 (ultima versione). Grazie per averlo condiviso!
silvioprog,

@rmuller Il sedcomando è lì appositamente, consentendo il rilevamento automatico della codifica dei caratteri. Ho ampliato la risposta per spiegarlo ora. Sarebbe cortese nei confronti dei lettori eliminare eventuali commenti irrilevanti rimanenti. Grazie.
Serge Stroobandt,

@SergeStroobandt Forse non ero abbastanza chiaro. Il mio punto è quando si utilizza "file -b --mime-encoding" invece di "file -bi" non è necessario filtrare il risultato con sed. Questo comando restituisce già solo la codifica del file. Quindi nel tuo esempio "us-ascii"
rmuller,

Questo in realtà non sembra fare nulla per me su Linux. Ho salvato un file come UTF-8 con BOM e mi aspettavo che venisse convertito in UTF-8 senza BOM e non è stato così.
Aaron Franke,

3

PHP iconv ()

iconv("UTF-8", "ISO-8859-15", $input);


1
Questa affermazione funziona benissimo durante la conversione di stringhe, ma non per i file.
jjwdesign,

2

DOS / Windows: utilizzare la tabella codici

chcp 65001>NUL
type ascii.txt > unicode.txt

Il comando chcppuò essere utilizzato per modificare la tabella codici. La tabella codici 65001 è il nome Microsoft per UTF-8. Dopo aver impostato la tabella codici, l'output generato dai seguenti comandi sarà impostato sulla tabella codici.


1

per scrivere il file delle proprietà (Java) normalmente lo uso in Linux (distribuzioni mint e ubuntu):

$ native2ascii filename.properties

Per esempio:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

PS: Ho scritto l'esecuzione numero uno / due in portoghese per forzare caratteri speciali.

Nel mio caso, nella prima esecuzione ho ricevuto questo messaggio:

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

Quando ho installato la prima opzione (gcj-5-jdk) il problema era terminato.

Spero che questo aiuti qualcuno.




0

Il mio strumento preferito per questo è Jedit (un editor di testo basato su Java) che ha due funzioni molto convenienti:

  • Uno che consente all'utente di ricaricare un testo con una codifica diversa (e, come tale, di controllare visivamente il risultato)
  • Un altro che consente all'utente di scegliere esplicitamente la codifica (e il carattere di fine riga) prima di salvare

0

Cambia semplicemente la codifica del file caricato nell'IDE IDEA di IntelliJ, a destra della barra di stato (in basso), dove è indicato il set di caratteri corrente. Viene richiesto di ricaricare o convertire, utilizzare Converti. Assicurati di aver effettuato il backup del file originale in anticipo.


0

Se le applicazioni della GUI di macOS sono il tuo pane e burro, SubEthaEdit è l'editor di testo che di solito vado per la codifica-wrangling - la sua "anteprima di conversione" ti consente di vedere tutti i caratteri non validi nella codifica di output e correggerli / rimuoverli.

Ed è open-source ora, quindi per loro 😉.


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.