Arquivos de conversão em lote para codificação

Respostas:

36

Cygwin ou GnuWin32 fornecem ferramentas Unix como iconve 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 .

charlatão quixote
fonte
4
Não use o mesmo nome de arquivo que entrada e saída! iconvparece 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 ...
Niavlys
1
FYI Esta questão está marcada com osx e não parece que nenhum dos comandos convert-all funcione no Yosemite ou no El Cap. A versão iconv da Apples não suporta --verbose ou -o, e a outra sintaxe de redirecionamento do stdout não funciona por algum motivo e apenas a envia para o stdout normal.
Scott McIntyre
28

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
}
akira
fonte
Conversão de ANSI para UTF via a sua primeira proposta não apagar todo o conteúdo do meu arquivo de texto ...
Acroneos
@ Acroneos: então você cometeu um erro: o arquivo é IN.txt, o arquivo externo é OUT.txt ... dessa forma, é impossível substituir o original. se você usou o mesmo nome de arquivo para IN.txt e OUT.txt, substitui o arquivo do qual está lendo, obviamente.
akira
O PowerShell será convertido em UTF com BOM. find e iconv pode ser muito mais fácil.
Pparas
6

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
Nagul
fonte
3

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.

Ladrilhador
fonte
Parece que eles não podem converter na mesma pasta, apenas em outra pasta de destino.
Uwe Keim
A versão pro permite a conversão no local. $ 20 / 3months. rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman 30/01
Ah, a versão expressa (gratuita) é inútil - apenas "detecta" utf-8 WITH BOM !! (todos podem fazer isso ). Somente a versão Pro, que renova automaticamente a cada 3 meses a US $ 20 por pop, será detectada automaticamente. O preço é alto para um usuário não corporativo. E Cuidado se você tentar a versão básica, e seu arquivo já estiver em utf-8 (sem BOM), este conversor o detectará como ASCII e, em seguida, (re -) "converterá" em utf-8, o que pode resultar em sem sentido. . Esteja ciente disso antes de tentar a versão expressa! Eles têm uma versão demo para o profissional que não produz saída - IMHO sem sentido, porque não é possível verificar os resultados antes de comprar!
SherylHohman 30/01
3

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-8codificaçã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 -csinalizador e passando o nome do arquivo como argumento posicional "$1"com -- {}. No meio, o utf-8arquivo de saída é nomeado temporariamente converted.

O findcomando é muito útil para tal automação de gerenciamento de arquivos.

Clique aqui para mais findabundância .

Serge Stroobandt
fonte
1

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

execute o comando acima no loop for.

Aneesh Garg
fonte
0

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

Francisco Vera
fonte
1
O site que você mencionou está fechado.
Etienne Delavennat 26/09/18
0

No meu caso de uso, eu precisava de detecção automática de codificação de entrada e havia muitos arquivos com Windows-1250codificaçã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' -- {} \;
Bedla
fonte