O senhor já abriu um pequeno e simples arquivo de texto ASCII e o viu inexplicavelmente exibido como onegiantunbrokenline?
Ao abrir o arquivo em um editor de texto diferente e mais inteligente, o arquivo é exibido corretamente em vários parágrafos.
A resposta para esse quebra-cabeça está em nosso velho amigo, caracteres invisíveis que não podemos ver, mas que são totalmente não querem nos pegar. Bem, exceto quando eles estão.
Os caracteres problemáticos invisíveis neste caso são novas linhas.
O senhor já se perguntou o que havia no final das suas linhas? Como programador, eu sabia que havia caracteres de fim de linha, mas, sinceramente, nunca pensei muito sobre eles. Eles simplesmente… funcionavam. Mas as novas linhas não são um padrão universalmente aceito; elas são diferentes dependendo de para quem o senhor pergunta e da plataforma em que estão computando:
DOS / Windows | CR LF | rn |
0x0D 0x0A |
Mac (antecipado) | CR | r |
0x0D |
Unix | LF | n |
0x0A |
Os termos Carriage Return (CR) e Line Feed (LF) derivam das máquinas de escrever manuais e das impressoras antigas baseadas em mecanismos semelhantes aos das máquinas de escrever (normalmente chamadas de Impressoras “Daisywheel” (roda de margarida)).
Em uma máquina de escrever, pressionar Line Feed faz com que o rolo do carro empurre uma linha para cima, sem alterar a posição do próprio carro, enquanto o Retorno do carro A alavanca desliza o carro de volta para o início da linha. Com toda a honestidade, não sou muito tenho idade suficiente para usar máquinas de escrever elétricas, portanto, na melhor das hipóteses, tenho uma lembrança vaga de todo o processo. A distinção entre CR e LF parece meio sem sentido – por que o senhor iria querer passar para o início de uma linha? sem também avance para a próxima linha? Esse é outro artefato analógico, como explica a Wikipedia:
Em impressoras, teletipos e terminais de computador que não eram capazes de exibir gráficos, o retorno de carro era usado sem passar para a próxima linha para permitir que os caracteres fossem colocados em cima dos caracteres existentes para produzir gráficos de caracteres, sublinhados e texto riscado.
Até o momento, temos:
- Termos confusos baseados em hardware arcaico que não está mais em uso e é confuso para novos usuários que não têm nenhum ponto de referência para esses termos;
- “Padrões” de plataforma completamente arbitrários para o que é exatamente a mesma função.
Basicamente, os negócios são como de costume na computação. Se o senhor estiver curioso, como eu estava, sobre a base histórica dessas decisões, A Wikipedia fornece todas as curiosidades sobre a nova linha que o senhor poderia desejar e muito mais:
A sequência
CR+LF
era de uso comum em muitos dos primeiros sistemas de computador que adotaram máquinas de teletipo, normalmente uma ASR33, como dispositivo de console, porque essa sequência era necessária para posicionar essas impressoras no início de uma nova linha. Nesses sistemas, o texto era frequentemente composto de forma rotineira para ser compatível com essas impressoras, já que o conceito de drivers de dispositivo que ocultavam esses detalhes de hardware do aplicativo ainda não estava bem desenvolvido; os aplicativos tinham de falar diretamente com a máquina de teletipo e seguir suas convenções. A separação das duas funções ocultava o fato de que a cabeça de impressão não podia retornar da extrema direita para o início da próxima linha no tempo de um caractere. É por isso que a sequência era sempre enviada com o CR primeiro. Na verdade, muitas vezes era necessário enviar caracteres extras (CRs ou NULs estranhos, que são ignorados) para dar tempo ao cabeçote de impressão de se mover para a margem esquerda. Mesmo depois que os teletipos foram substituídos por terminais de computador com taxas de transmissão mais altas, muitos sistemas operacionais ainda suportavam o envio automático desses caracteres de preenchimento, para compatibilidade com terminais mais baratos que exigiam vários caracteres para rolar a tela.O uso do CP/M de
CR+LF
fazia sentido para o uso de terminais de computador por meio de linhas seriais. O MS-DOS adotou oCR+LF
do CP/M, e essa convenção foi herdada pelo Windows.
Este emocionante A diferença na forma como as novas linhas funcionam significa que o senhor pode esperar ver um dos três (ou mais, como descobriremos mais tarde) caracteres de nova linha nesses arquivos de texto ASCII “simples”.
Se tiver sorte, o senhor escolherá um editor bastante inteligente que poderá detectar e exibir corretamente os finais de linha dos arquivos de texto que abrir. Se tiver menos sorte, o senhor verá onegiantunbrokenline, ou um monte de ^M
extras no arquivo.
Pior ainda, é possível misturar todas essas três terminações de linha no mesmo arquivo. Inocentemente, copie e cole um comentário ou trecho de código de um arquivo com um conjunto diferente de terminações de linha e salve-o. Bam, o senhor tem um arquivo com vários finais de linha. Isso o senhor não consegue ver. Eu mesmo já fiz isso acidentalmente. (Observe que isso depende de sua escolha de editor de texto; alguns normalizam automaticamente os finais de linha para corresponder às configurações do arquivo atual ao serem colados).
Isso é complicado pelo fato de que alguns editores, até mesmo editores que deveriam saber melhor, como o Visual Studio, têm nenhum modo que mostre marcadores de fim de linha. É por isso que, ao tentar abrir um arquivo que tem vários finais de linha, o Visual Studio perguntará educadamente se pode normalizar o arquivo para um conjunto de finais de linha.
Essa caixa de diálogo do Visual Studio apresenta os seguintes cinco (!) conjuntos possíveis de finais de linha para o arquivo:
- Windows (CR LF)
- Macintosh (CR)
- Unix (LF)
- Separador de linha Unicode (LS)
- Separador de parágrafos Unicode (PS)
Os dois últimos são novos para mim. Não sei em que circunstâncias o senhor poderia querer esses Marcadores de nova linha Unicode.
Mesmo que o senhor excluir o unicode e se ater ao ASCII da velha guarda, como a maioria dos relacionamentos no Facebook… é complicado. Acho fascinante o fato de que a mundana newline ASCII tenha tanto conhecimento antigo de computação por trás dela, e que ela ainda regularmente O senhor nos visita em lugares inesperados.
Se o senhor trabalha com arquivos de texto de alguma forma – e que programador não trabalha – deve saber que nem todas as novas linhas são criadas igualmente. O Great Newline Schism é algo de que o senhor precisa estar ciente. Certifique-se de que suas ferramentas possam mostrar ao senhor não apenas aqueles incômodos caracteres de espaço em branco invisíveis, mas também os finais de linha.