Codificação do Windows-1252 para UTF-8

Copiei certos ficheiros de uma máquina do Windows para uma máquina Linux. Então todos os arquivos codificados do Windows (windows-1252) precisam ser convertidos para UTF-8. Os arquivos que já estão em UTF-8 não devem ser alterados. Estou a planear usar o utilitário recode para isso. Como posso especificar que o utilitário recode só deve converter ficheiros codificados windows-1252 e não os ficheiros UTF-8?

Uso de exemplo de recode:

recode windows-1252.. myfile.txt

isto converteria myfile.txt do windows-1252 para UTF-8. Antes fazendo isso, eu gostaria de saber que myfile.txt é realmente o windows-1252 codificado e não UTF-8 codificado. Caso contrário, acredito que isto iria corromper o ficheiro.

Author: TRiG, 2010-01-06

10 answers

Como esperas que o recode saiba que um ficheiro é o Windows-1252? Em teoria, eu acredito que qualquer arquivo é um arquivo Windows-1252 válido, como mapeia cada byte possível para um personagem.

Agora há certamente características que fortemente sugerem que é UTF-8 - se começar com o UTF-8 BOM, por exemplo-mas eles não seriam definitivos.

Uma opção seria detectar se é realmente um arquivo UTF-8 completamente válido primeiro, eu suponho... mais uma vez, isso seria apenas sugestivo.

Não estou familiarizado com a ferramenta recode em si, mas poderá querer ver se é capaz de recodificar um ficheiro de e para a codificação mesma - Se o fizer com um ficheiro inválido (isto é, um que contém sequências de bytes UTF-8 inválidas), poderá converter as sequências inválidas em pontos de interrogação ou algo semelhante. Nesse ponto você poderia detectar que um arquivo é válido UTF-8, recodificando-o para UTF-8 e vendo se a entrada e a saída é idêntica.

Alternativamente, faça isto programaticamente ao invés de usar o utilitário recode - seria bastante simples em C#, por exemplo.

Mas só para reiterar: tudo isto é heurístico. Se você realmente não sabe a codificação de um arquivo, nada vai lhe dizer com 100% de precisão.
 34
Author: Jon Skeet, 2010-01-06 15:42:34

Pode utilizar iconv:

iconv -f WINDOWS-1252 -t UTF-8 filename.txt

 58
Author: Gregory Pakosz, 2012-08-16 21:03:54

Não há uma maneira geral de saber se um ficheiro está codificado com uma codificação específica. Lembre-se que uma codificação não é mais do que um "acordo" sobre como os bits de um arquivo devem ser mapeados em caracteres.

Se você não sabe quais de seus arquivos estão realmente codificados em UTF-8 e quais são codificados no windows-1252, você terá que inspecionar todos os arquivos e descobrir por si mesmo. No pior dos casos, isso pode significar que tens de abrir cada um deles com um dos dois. encodings e ver se eles "parecem" corretos -- ou seja, todos os caracteres são exibidos corretamente. Claro, você pode usar a ferramenta de apoio, a fim de fazer isso, por exemplo, se você tiver certeza de que alguns caracteres são contidas em ficheiros que têm um mapeamento diferente no windows-1252 vs. UTF-8, você pode grep para eles depois de executar os arquivos através do "iconv", como mencionado por Seva Akekseyev.

Outro caso de sorte para ti seria, se soubesses que os ficheiros contêm apenas caracteres. que são codificadas identicamente em UTF-8 e windows-1252. Nesse caso, claro, já acabaste.
 7
Author: kleiba, 2010-01-06 15:52:58
Aqui está uma transcrição de outra resposta que dei a uma pergunta similar:

Se aplicar o utf8_ codigo () a um texto já UTF8, irá devolver um resultado UTF8.

Fiz uma função que aborda todas estas questões. Sua codificação chamada:: toUTF8 ().

Você não precisa saber qual é a codificação das suas cordas. Pode ser Latin1 (iso 8859-1), Windows-1252 ou UTF8, ou a cadeia pode ter uma mistura deles. Codificação:: toUTF8 () irá converter tudo para UTF8.

Fi-lo porque um serviço estava a dar-me uma fonte de dados confusa, misturando UTF8 e Latin1 na mesma corda.

Utilização:

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);

Telecarregamento:

Https://github.com/neitanod/forceutf8

Actualização:

Incluí outra função, a codificação:: fixUFT8 (), que irá corrigir todas as cadeias de UTF8 que parecem Distorcidas.

Utilização:

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

Exemplos:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");

Irá sair:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

Actualização: eu transformei o função (forcutf8) em uma família de funções estáticas em uma classe chamada codificação. A nova função é codificação:: toUTF8 ().

 7
Author: Sebastián Grignoli, 2014-07-02 14:11:27

Use o comando iconv.

Para ter a certeza que o ficheiro está no Windows-1252, abra-o no bloco de notas (por baixo do Windows) e carregue em gravar As. O bloco de notas sugere a codificação atual como padrão; se for Windows-1252 (ou qualquer codepage de 1 byte, já agora), ele diria "ANSI".

 2
Author: Seva Alekseyev, 2010-01-06 15:42:51

Se quiser mudar o nome de vários ficheiros num único comando-digamos que quer converter todos os ficheiros *.txt - Aqui está o comando:

find . -name "*.txt" -exec iconv -f WINDOWS-1252 -t UTF-8 {} -o {}.ren \; -a -exec mv {}.ren {} \;
 2
Author: Anthony O., 2016-01-19 15:54:53

Se TEM a certeza que os seus ficheiros são UTF-8 ou Windows 1252 (ou Latin1), pode aproveitar o facto de que o recode irá sair com um erro se tentar converter um ficheiro inválido.

Enquanto o utf8 é válido Win-1252, o reverso não é verdadeiro: o win-1252 não é válido UTF-8. Então:

recode utf8..utf16 <unknown.txt >/dev/null || recode cp1252..utf8 <unknown.txt >utf8-2.txt

Irá cuspir erros para todos os ficheiros cp1252, e depois proceder à sua conversão para UTF8.

Eu embrulhava isto num guião de cleaner bash, mantendo uma cópia de segurança de todos os convertidos. arquivo.

Antes de fazer a conversão de codificação, você pode querer primeiro garantir que você tem terminações de linha consistentes em todos os arquivos. Caso contrário, recode irá reclamar por causa disso, e pode converter arquivos que já eram UTF8, mas apenas tinha os finais de linha errado.

 0
Author: mivk, 2010-12-20 15:16:02

Poderá alterar a codificação de um ficheiro com um editor como o notepad++. Basta ir para a codificação e selecionar o que você quer.

Prefiro sempre as janelas 1252

 0
Author: thanos.a, 2013-03-27 17:03:25

Encontrei esta documentação para o comando TYPE:

Converter um ficheiro ASCII (Windows1252) num ficheiro de texto Unicode (UCS-2 le):

For /f "tokens=2 delims=:" %%G in ('CHCP') do Set _codepage=%%G    
CHCP 1252 >NUL    
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > unicode.txt 2>NUL    
CMD.EXE /D /U /C TYPE ascii_file.txt >> unicode.txt    
CHCP %_codepage%    

A técnica acima (baseada num script de Carlos M.) cria primeiro um ficheiro com uma marca de ordem de bytes (BOM) e depois adiciona o conteúdo do ficheiro original. O CHCP é usado para garantir que a sessão está a correr com a Página de código Windows1252 para que os caracteres 0xFF e 0xFE (Ÿ) sejam interpretados correctamente.

 0
Author: Napfkuchen, 2015-10-01 21:47:49

UTF-8 não tem um BOM pois é supérfluo e inválido. Quando um BOM é útil está em UTF-16 que pode ser trocado byte como no caso da Microsoft. UTF-16 if for internal representation in a memory buffer. Use UTF-8 para transferência. Por padrão, tanto UTF-8, qualquer outra coisa derivada de US-ASCII e UTF-16 são Ordem de byte natural / rede. O Microsoft UTF-16 requer um BOM como ele é Byte trocado.

Para Windows encoberto-1252 para ISO8859-15, primeiro converto ISO8859 - 1 para US-ASCII para códigos com glifos semelhantes. Em seguida, converto Windows-1252 até ISO8859-15, outros glifos não ISO8859-15 para múltiplos caracteres US-ASCII.

 0
Author: Andrew Buckeridge, 2016-05-30 05:43:40