Arquivos convertidos em lote para codificação

45

Como posso converter arquivos em lote em um diretório para sua codificação (por exemplo, ANSI- > UTF-8) com um comando ou ferramenta?

Para arquivos únicos, um editor ajuda, mas como fazer o trabalho de arquivos em massa?

    
por desolat 21.08.2009 / 11:12

10 respostas

34

Cygwin ou GnuWin32 fornece ferramentas Unix como iconv e dos2unix (e unix2dos ). Sob Unix / Linux / Cygwin, você vai querer usar "windows-1252" como codificação em vez de ANSI (veja abaixo). (A menos que você saiba que seu sistema está usando uma página de códigos diferente de 1252 como sua página de códigos padrão, caso em que você precisará informar iconv a página de código correta para traduzir.)

Converta de um ( -f ) para o outro ( -t ) com:

$ iconv -f windows-1252 -t utf-8 infile > outfile

Ou em um formulário para encontrar tudo e conquistar:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;

Alternativamente:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;

Esta pergunta foi feita muitas vezes neste site, então aqui estão algumas informações adicionais sobre "ANSI". Em uma resposta a uma pergunta relacionada, CesarB menciona :

There are several encodings which are called "ANSI" in Windows. In fact, ANSI is a misnomer. iconv has no way of guessing which you want.

The ANSI encoding is the encoding used by the "A" functions in the Windows API (the "W" functions use UTF-16). Which encoding it corresponds to usually depends on your Windows system language. The most common is CP 1252 (also known as Windows-1252). So, when your editor says ANSI, it is meaning "whatever the API functions use as the default ANSI encoding", which is the default non-Unicode encoding used in your system (and thus usually the one which is used for text files).

A página à qual ele se liga dá esse detalhe histórico (citado de um PDF da Microsoft ) sobre as origens do CP 1252 e ISO-8859-1, outra codificação frequentemente usada:

[...] this comes from the fact that the Windows code page 1252 was originally based on an ANSI draft, which became ISO Standard 8859-1. However, in adding code points to the range reserved for control codes in the ISO standard, the Windows code page 1252 and subsequent Windows code pages originally based on the ISO 8859-x series deviated from ISO. To this day, it is not uncommon to have the development community, both within and outside of Microsoft, confuse the 8859-1 code page with Windows 1252, as well as see "ANSI" or "A" used to signify Windows code page support.

    
por 30.09.2009 / 20:17
27

com o powershell você pode fazer algo assim:

%  get-content IN.txt | out-file -encoding ENC -filepath OUT.txt

enquanto o ENC é algo como unicode, ascii, utf8, utf32. checkout 'help out-file'.

para converter todos os arquivos * .txt em um diretório para o utf8, faça algo assim:

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

que cria uma versão convertida de cada arquivo .txt em DIR2.

EDITAR: Para substituir os arquivos em todos os subdiretórios, use:

% foreach($i in ls -recurse -filter "*.java") {
    $temp = get-content $i.fullname
    out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}
    
por 26.02.2010 / 07:31
6

A página da Wikipedia sobre novas linhas tem uma seção sobre os utilitários de conversão .

Esta parece ser sua melhor aposta para uma conversão usando apenas as ferramentas que o Windows envia:

TYPE unix_file | FIND "" /V > dos_file
    
por 21.08.2009 / 11:21
3

O UTFCast é um conversor Unicode para Windows que suporta o modo batch. Eu estou usando a versão paga e estou bastante confortável com isso.

UTFCast is a Unicode converter that lets you batch convert all text files to UTF encodings with just a click of your mouse. You can use it to convert a directory full of text files to UTF encodings including UTF-8, UTF-16 and UTF-32 to an output directory, while maintaining the directory structure of the original files. It doesn't even matter if your text file has a different extension, UTFCast can automatically detect text files and convert them.

    
por 06.12.2011 / 19:48
1

Você pode usar o EncodingMaster . É grátis, tem uma versão Windows, Linux e Mac OS X e funciona muito bem.

    
por 01.02.2014 / 09:01
1

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

execute o comando acima para loop.

    
por 06.06.2014 / 16:47
1

Oneliner usando find, com detecção automática

A codificação de caracteres de todos os arquivos de texto correspondentes é detectada automaticamente e todos os arquivos de texto correspondentes são convertidos em utf-8 encoding:

$ 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"' -- {} \;

Para executar essas etapas, um sub shell sh é usado com -exec , executando uma linha com o sinal -c e passando o nome do arquivo como o argumento posicional "$1" with -- {} . No meio, o arquivo de saída utf-8 é temporariamente nomeado converted .

O comando find é muito útil para essa automação de gerenciamento de arquivos.

Clique aqui para mais find galore .

    
por 28.08.2016 / 21:53
0

Existe dos2unix no unix.
Havia outra ferramenta semelhante para o Windows ( outra referência aqui ).

Como faço para converter arquivos de texto Unix e Windows? tem mais truques

    
por 21.08.2009 / 11:14
0

Use este script Python: link Ele funciona em qualquer plataforma. Requer o Python 2.7.

    
por 01.07.2018 / 12:18
0

No meu caso de uso, eu precisava de detecção automática de codificação de entrada e havia muitos arquivos com codificação Windows-1250 , para qual comando file -bi <FILE> retorna charset=unknown-8bit . Este parâmetro não é válido para iconv .

Eu tive os melhores resultados com enca .

Converta todos os arquivos com extensão txt para utf-8

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;
    
por 16.09.2018 / 19:40