Estou unificando a codificação de um grande grupo de arquivos de texto, reunidos ao longo do tempo em computadores diferentes. Estou indo principalmente da ISO-8859-1 para a UTF-8. Isso converte muito bem um arquivo:
recode ISO-8859-1..UTF-8 file.txt
É claro que eu quero fazer o processamento em lote automatizado para todos os arquivos, e simplesmente executar o acima para cada arquivo tem o problema de que os arquivos já codificados em UTF-8 terão sua codificação interrompida. (Por exemplo, o caractere 'a' originalmente na norma ISO-8859-1 aparece como esta, visto como UTF-8, se a recodificação acima é feito duas vezes: � -> ä -> ä
)
Minha pergunta é: que tipo de script executaria a recodificação apenas se necessário , ou seja, apenas para arquivos que ainda não estavam na codificação de destino (UTF-8 no meu caso)?
Olhando para a página de manual de recodificação, não consegui descobrir como fazer algo assim. Então eu acho que isso se resume a como verificar facilmente a codificação de um arquivo, ou pelo menos se é UTF-8 ou não. Esta resposta implica que você pode reconhecer arquivos UTF-8 válidos com recodificação, mas como? Qualquer outra ferramenta também ficaria bem, desde que eu pudesse usar o resultado de forma condicional em um script bash ...
Respostas:
Esta mensagem é bastante antiga, mas acho que posso contribuir para este problema:
Primeiro, crie um script chamado recodeifneeded :
Você pode usá-lo desta maneira:
Portanto, se você quiser executá-lo recursivamente e alterar todas as codificações de arquivos * .txt para (digamos) utf-8:
Eu espero que isso ajude.
fonte
Esse script, adaptado da idéia de harrymc , que recodifica um arquivo condicionalmente (com base na existência de certos caracteres escandinavos codificados em UTF-8), parece funcionar bem para mim de maneira tolerável.
(O processamento de arquivos em lote é obviamente uma questão simples, por exemplo
for f in *txt; do recode-to-utf8.sh $f; done
.)Nota : isso depende totalmente do arquivo de script ser UTF-8. E, como essa é obviamente uma solução muito limitada, adequada ao tipo de arquivo que tenho, fique à vontade para adicionar respostas melhores que resolvam o problema de uma maneira mais genérica.
fonte
O UTF-8 possui regras estritas sobre quais seqüências de bytes são válidas. Isto significa que se os dados poderiam ser UTF-8, você raramente obter falsos positivos se você assumir que ele é .
Então você pode fazer algo assim (em Python):
Em um script de shell, você pode usar
iconv
para realizar a conversão, mas precisará de um meio de detectar UTF-8. Uma maneira é usariconv
com UTF-8 como codificação de origem e de destino. Se o arquivo era UTF-8 válido, a saída será igual à entrada.fonte
O ISO-8859-1 e o UTF-8 são idênticos nos primeiros 128 caracteres. Portanto, seu problema é realmente como detectar arquivos que contenham caracteres engraçados, ou seja, codificados numericamente como acima de 128.
Se o número de caracteres engraçados não for excessivo, você pode usar o egrep para digitalizar e descobrir quais arquivos precisam ser recodificados.
fonte
Estou um pouco atrasado, mas tenho lutado tantas vezes com a mesma pergunta várias vezes ... Agora que encontrei uma ótima maneira de fazer isso, não posso deixar de compartilhá-lo :)
Apesar de ser um usuário do emacs, recomendo que você use o vim hoje.
com este comando simples, ele irá recodificar seu arquivo, independentemente da codificação desejada:
nunca encontrei algo que me desse melhores resultados do que isso.
Espero que ajude alguns outros.
fonte
Você pode detectar e adivinhar o conjunto de caracteres de um arquivo usando
Este forro do bash one usa o comando acima como a entrada para recodificar e fazer loop em vários arquivos:
Não se preocupe em converter o utf-8 existente, a recodificação é inteligente o suficiente para não fazer nada nesse caso e imprimiria uma mensagem:
fonte
Existem várias maneiras de detectar um conjunto de caracteres e nenhum é 100% confiável. Isso ajuda muito se os possíveis idiomas e conjuntos de caracteres forem limitados e você tiver texto suficiente para contar bytes específicos.
Outra abordagem é tentar
recode
(usando a recodificação ) e verificar o valor de saída quanto a erros.Para diferenciar apenas UTF-8 e ISO-8859-X para idiomas usando caracteres latinos, um truque é tentar recodificar primeiro em UTF-16. Ele funcionará para UTF-8 ou sairá com um erro para ISO-8859-X.
Às vezes eu uso isso em um script:
fonte