Um nome com os acentos trocados, um arquivo importado só até a primeira linha e um código que não coincide com o cadastro, embora pareça igual, costumam ter explicação nos bytes do arquivo de texto. O arquivo guarda apenas bytes, e o programa que lê precisa usar as mesmas regras do programa que gravou, tanto para os caracteres quanto para o fim de cada linha.
A codificação
Um arquivo de texto não guarda letras, e sim números de 0 a 255, chamados de bytes. A codificação é a regra que transforma cada caractere em bytes na gravação e os bytes em caracteres na leitura. Para as letras sem acento, os números e os sinais mais comuns, quase todas as codificações usam os mesmos bytes, e por isso um arquivo pode parecer correto até a primeira palavra acentuada.
As codificações mais comuns no Windows são estas:
- ANSI: o nome que o Windows dá à tabela de caracteres dos programas que não trabalham com Unicode, definida pelo idioma do sistema. No Windows em português, essa tabela é a Windows-1252, com um byte para cada caractere, inclusive os acentuados.
- UTF-8: a codificação padrão das integrações atuais, com um byte para as letras sem acento e dois bytes para as letras acentuadas.
- UTF-8 com BOM: o UTF-8 com uma marca de três bytes no início do arquivo, que anuncia a codificação a quem lê.
- UTF-16: a codificação que algumas telas do Windows chamam de Unicode, com dois bytes para cada caractere comum.
A palavra ação tem quatro caracteres, ocupa quatro bytes na Windows-1252 e seis bytes no UTF-8, porque o ç e o ã usam dois bytes cada um. Quando um arquivo gravado em UTF-8 é lido como Windows-1252, cada letra acentuada vira dois símbolos, e ação aparece como ação. No caminho inverso, um arquivo gravado em Windows-1252 e lido como UTF-8 mostra um losango com uma interrogação no lugar de cada letra acentuada.
O Bloco de Notas mostra a codificação do arquivo na barra de status e mantém essa codificação ao salvar. A janela Salvar como permite escolher outra, entre elas ANSI, UTF-16 LE, UTF-8 e UTF-8 com BOM, e um arquivo novo é gravado em UTF-8 sem BOM.
A marca BOM
O BOM é a marca de três bytes no início de um arquivo UTF-8. Alguns programas usam a marca para reconhecer a codificação, e outros a leem como parte do primeiro campo. Lida como Windows-1252, a marca aparece como  antes do primeiro texto. Um importador que não trata a marca recebe o primeiro campo da primeira linha com bytes a mais, às vezes invisíveis, e um cabeçalho com a coluna codigo deixa de ser reconhecido, com a mensagem de que a coluna não existe.
O prompt de comando e o PowerShell
O prompt de comando usa uma tabela própria, diferente da tabela ANSI. No Windows em português, essa tabela é a página de código 850, e o comando chcp mostra a tabela em uso. Por isso, a saída de um comando gravada em arquivo, como em ipconfig /all > rede.txt, mostra palavras como Configuração com símbolos no lugar dos acentos quando o arquivo é aberto no Bloco de Notas.
O PowerShell tem padrões próprios:
- no Windows PowerShell, que acompanha o Windows, o operador
>e o comandoOut-Filegravam em UTF-16, e o comandoSet-Contentgrava na tabela ANSI; - no PowerShell 7, instalado à parte, o padrão é o UTF-8 sem BOM;
- a opção
-Encodingdefine a codificação de forma explícita, e no Windows PowerShell a opção-Encoding UTF8grava o UTF-8 com BOM.
Um arquivo em UTF-16 aberto por uma ferramenta que não reconhece essa codificação mostra um espaço ou um símbolo entre as letras, e algumas ferramentas de busca, como o findstr, não encontram o texto procurado.
A quebra de linha
O fim de cada linha também é marcado por bytes, e cada sistema adota uma marca:
- CRLF: dois bytes, o retorno de carro e a nova linha, usados pelo Windows;
- LF: um byte, a nova linha, usado pelo Linux e pela maioria dos servidores da internet;
- CR: um byte, o retorno de carro, usado nos computadores antigos da Apple.
Um importador que separa as linhas pelo CRLF lê um arquivo com LF como uma linha só e importa apenas o primeiro registro, ou recusa o arquivo. No caminho inverso, um programa que separa as linhas pelo LF deixa o CR colado ao último campo de cada linha, e um código seguido desse caractere invisível deixa de coincidir com o cadastro.
O Bloco de Notas atual reconhece as três marcas e mostra a marca do arquivo na barra de status, como Windows (CRLF) ou Unix (LF). O Bloco de Notas do Windows 7 mostrava um arquivo com LF em uma única linha.
Na transferência por FTP, o modo ASCII converte as quebras de linha entre os sistemas, e o modo binário preserva os bytes. Um arquivo de texto transferido no modo binário chega com as quebras do sistema de origem, e um arquivo compactado ou um PDF transferido no modo ASCII chega danificado.
Os bytes do arquivo
Quando a tela não basta, os bytes mostram a codificação e as quebras de linha. No PowerShell, o comando Format-Hex .\precos.txt | Select-Object -First 4 mostra os primeiros bytes do arquivo em hexadecimal, ao lado do texto. Alguns valores identificam o arquivo:
- a sequência EF BB BF no início indica o BOM do UTF-8;
- o par 0D 0A indica a quebra de linha do Windows, e o 0A sozinho indica a quebra do Linux;
- uma letra acentuada em dois bytes começados por C3, como C3 A7 para o ç, indica o UTF-8;
- um byte só para a letra acentuada, como E7 para o ç, indica a Windows-1252;
- o byte 87 para o ç indica a página de código 850 do prompt de comando.
No suporte
Diante de acentos trocados ou de um arquivo lido como uma linha só, convém identificar a codificação e a quebra de linha antes de alterar qualquer dado. A barra de status do Bloco de Notas mostra as duas informações, os bytes confirmam o que a tela não deixa claro, e o arquivo original fica preservado, com as conversões feitas em uma cópia.
Para guardar
- O arquivo de texto guarda bytes, e a codificação define como eles viram caracteres.
- No Windows em português, ANSI significa a Windows-1252, e o prompt de comando usa a página de código 850.
- O UTF-8 usa dois bytes para cada letra acentuada, e o BOM é uma marca de três bytes no início do arquivo.
- O Windows marca o fim da linha com CRLF, e o Linux, com LF.
- No Windows PowerShell, o operador de redirecionamento grava em UTF-16.
O arquivo de vendas baixado do servidor da operadora de cartões chega completo, mas o importador lê apenas o primeiro registro. O que conferir no arquivo?
A quebra de linha. Um arquivo gerado em um servidor Linux usa LF, e um importador que espera o CRLF do Windows lê o arquivo inteiro como uma linha só. A barra de status do Bloco de Notas mostra a marca usada, e uma transferência no modo binário explica por que a marca original foi mantida.
Um arquivo gerado com ipconfig /all > rede.txt mostra Configura‡Æo no lugar de Configuração quando é aberto no Bloco de Notas. O arquivo está danificado?
Não. O prompt de comando gravou o texto na página de código 850, e o Bloco de Notas leu os bytes como se fossem da tabela ANSI. O conteúdo está correto, e a leitura com a codificação certa mostra os acentos.