27 de jan de 2014

Arquivos ASCII - Convertendo formato DOS para Unix e vice-versa

Introdução

Arquivos texto (aqueles que contém somente texto) não são representados da mesma forma nos diversos sistemas operacionais existentes. Um exemplo clássico é a diferença entre a representação de arquivos ASCII em sistemas da Microsoft e sistemas da fámilia Unix (como o Linux). Enquanto a representação da Microsoft usa um valor 13, seguido de um valor 10 para representar um fim de linha (escrito quando você digita o [ENTER]), a representação Unix (também usadas nos Macs modernos) usa apenas o valor 10. O resultado é que se um arquivo ASCII for transferido byte a byte de um sistema para outro, ele pode não ser apresentado corretamente na tela do sistema para onde foi copiado.

Alguns editores de texto detectam esse tipo de problema e fazem a correção automaticamente, para apresentar o arquivo de maneira correta para o usuário. Outros, apresentam o arquivo da maneira como ele realmente é.




O problema

Muitos alunos do curso, por não saber desses detalhes, fazem transferência de arquivos com código fonte (arquivo ASCII) e depois passam a observar coisas estranhas acontecendo com seus arquivos.


 
Arquivo no formato Unix, apresentado incorretamente no Windows 



Arquivo no formato Windows apresentado no próprio Windows


 
Arquivo no formato Windows, apresentado incoretamente no Linux



Arquivo no formato Unix apresentado no Linux


Veja bem:

O Windows não entende o caracter 10 como final de linha, então mostra arquivos Unix sem as quebras de linha e com um caracter esquisito onde deveria haver a quebra de linha.
O Linux por sua vez não entende o caractere 13 como início do código para fim de linha e mostra o caractere 13 (como um símbolo esquisito), depois vê o caractere 10 e muda de linha. O problema se agrava ainda mais se a pessoa tenta editar isso "na mão", não arruma todos os finais de linha e depois faz novas transferências do arquivo, entre Linux e Windows, aumentando a quantidade de caracteres estranhos até que o arquivo fique ilegível (já casos em que o próprio compilador não conseguia interpretar o arquivo...).

A solução

O método mais usado para transferência de arquivos entre sistemas é o FTP (file transfer protocol) todo cliente de FTP permite transferências de arquivo no modo binário (byte a byte) ou no modo ASCII (com conversão automática de final de linha entre sistemas diferentes). Se você transferir um arquivo binário (como um zip por exemplo) no modo ASCII, o arquivo fica corrompido (pois foi alterado durante a transferência). Se você transferir um arquivo ASCII no modo binário podem ocorrer os problemas mostrados nas imagens acima.

Alguns protocolos de transferência de arquivo utilizam somente o modo binário (como o SMB, por exemplo, que é usado para transferir arquivos entre uma estação Windows e o servidor Linux), neste caso você tem duas opções para não ter problemas com os arquivos texto:
  • Usar um editor de texto que faça a conversão automaticamente, ou
  • usar um programa que altere o código ASCII do seu texto.
Instale os programas dos2unix que converte do formato MS para o formato Unix e o programa unix2dos que faz a conversão contrária. Para maiores detalhes, digite o comando man dos2unix ou man unix2dos num terminal.

Para maiores informações, ou para esclarecer dúvidas, deixe um comentário.