Como 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?
Como 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?
Respostas:
Cygwin ou GnuWin32 fornecem ferramentas Unix como iconv
e dos2unix
(e unix2dos
). Em Unix / Linux / Cygwin, você deseja 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ódigo diferente de 1252 como página de código padrão, nesse caso, você precisará informar ao iconv a página de código correta da qual traduzir.)
Converta de um ( -f
) para outro ( -t
) com:
$ iconv -f windows-1252 -t utf-8 infile > outfile
Ou na forma de 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 várias vezes neste site, então, aqui estão algumas informações adicionais sobre "ANSI". Em resposta a uma pergunta relacionada, CesarB menciona :
Existem várias codificações chamadas "ANSI" no Windows. De fato, ANSI é um nome impróprio . iconv não tem como adivinhar o que você deseja.
A codificação ANSI é a codificação usada pelas funções "A" na API do Windows (as funções "W" usam UTF-16). Qual codificação corresponde normalmente depende do idioma do sistema Windows. O mais comum é o CP 1252 (também conhecido como Windows-1252). Portanto, quando seu editor diz ANSI, significa "o que quer que as funções da API usem como a codificação ANSI padrão", que é a codificação não-Unicode padrão usada no seu sistema (e, portanto, geralmente a que é usada para arquivos de texto).
A página para a qual ele vincula fornece esse boato histórico (citado em um PDF da Microsoft ) sobre as origens do CP 1252 e ISO-8859-1, outra codificação frequentemente usada:
[...] isso vem do fato de que a página de código 1252 do Windows era originalmente baseada em um rascunho ANSI, que se tornou o padrão ISO 8859-1. No entanto, ao adicionar pontos de código ao intervalo reservado para códigos de controle no padrão ISO, a página de código do Windows 1252 e as páginas de código subsequentes do Windows originalmente baseadas na série ISO 8859-x se desviavam do ISO. Até hoje, não é incomum que a comunidade de desenvolvimento, dentro e fora da Microsoft, confunda a página de códigos 8859-1 com o Windows 1252, bem como consulte "ANSI" ou "A" usado para significar suporte à página de códigos do Windows .
iconv
parece truncar arquivos para 32.768 bytes se eles excederem esse tamanho. Como ele escreve no arquivo que ele está tentando ler, ele consegue fazer o trabalho se o arquivo é pequeno o suficiente, então ele trunca o arquivo sem qualquer aviso ...
Com o PowerShell, você pode fazer algo assim:
% get-content IN.txt | out-file -encoding ENC -filepath OUT.txt
enquanto ENC é algo como unicode, ascii, utf8, utf32. checkout 'arquivo de ajuda'.
Para converter todos os arquivos * .txt em um diretório para 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 no DIR2.
EDIT: 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
}
A página da Wikipedia sobre novas linhas possui uma seção sobre utilitários de conversão .
Esta parece ser sua melhor aposta para uma conversão usando apenas as ferramentas fornecidas pelo Windows:
TYPE unix_file | FIND "" /V > dos_file
UTFCast é um conversor Unicode para Windows que suporta o modo em lote. Estou usando a versão paga e estou bastante confortável com ela.
O UTFCast é um conversor Unicode que permite converter em lote todos os arquivos de texto em codificações UTF com apenas um clique do mouse. Você pode usá-lo para converter um diretório cheio de arquivos de texto em codificações UTF, incluindo UTF-8, UTF-16 e UTF-32 em um diretório de saída, mantendo a estrutura de diretórios dos arquivos originais. Não importa se o seu arquivo de texto tem uma extensão diferente, o UTFCast pode detectar automaticamente os arquivos de texto e convertê-los.
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
codificação:
$ 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, sh
é usado um sub shell -exec
, executando um one-liner com o -c
sinalizador e passando o nome do arquivo como argumento posicional "$1"
com -- {}
. No meio, o utf-8
arquivo de saída é nomeado temporariamente converted
.
O find
comando é muito útil para tal automação de gerenciamento de arquivos.
Clique aqui para mais find
abundância .
iconv -f original_charset -t utf-8 originalfile > newfile
execute o comando acima no loop for.
Use este script Python: https://github.com/goerz/convert_encoding.py Ele funciona em qualquer plataforma. Requer Python 2.7.
Existe dos2unix
no unix.
Havia outra ferramenta semelhante para o Windows ( outra referência aqui ).
Como faço para converter entre arquivos de texto Unix e Windows? tem mais alguns truques
dos2unix
é útil para converter quebras de linha , mas o OP está procurando converter codificações de caracteres.
Você pode usar o EncodingMaster . É grátis, possui uma versão para Windows, Linux e Mac OS X e funciona muito bem.
No meu caso de uso, eu precisava de detecção automática de codificação de entrada e havia muitos arquivos com Windows-1250
codificação, para os quais o 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 em utf-8
find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;