Então criei dois arquivos, cada um com 127.955 linhas e 24 caracteres aleatórios por linha. No que diz respeito ao texto, os dois arquivos eram completamente idênticos. No entanto, um arquivo tinha quebras de linha do Unix e o outro tinha quebras de linha do Windows. O arquivo com quebras de linha do Unix tinha 3.124 KB, enquanto o arquivo com quebras de linha do Windows tinha 3.249 KB. Não houve outras diferenças entre os arquivos, então devo assumir que, por algum motivo, as quebras de linha do Windows ocupam mais espaço. Alguma ideia do porquê?
Responder1
Se você abrisse os arquivos de texto no editor hexadecimal, a diferença que veria no final de uma linha seria a seguinte:
Terminações de linha do Windows:0x0D 0x0A
Finais de linha Unix:0x0A
The 0x0D
é o valor hexadecimal para o retorno de carro (representado textualmente simplesmente como \r
).
O 0x0A
é o valor hexadecimal para o caractere de nova linha (representado textualmente simplesmente como \n
).
Quando os finais de linha estiverem no formato EOL do Windows, as linhas terminarão com 2 caracteres: \r\n
; enquanto o formato Unix EOL termina com 1 caractere: \n
.
Portanto, 127,955 * (24 + 1) == 3,198,875 bytes (3,123.9 KB)
para Unix EOL e 127,955 * (24 + 2) == 3,326,830 bytes (3,248.86 KB)
para Windows EOL.
Espero que ajude.
Responder2
Quanto ao verdadeiro "porquê" - Historicamente, uma máquina de teletipo usava Carriage Return (hex 0D) para mover a cabeça de impressão para a margem esquerda, seguida por Line Feed (hex 0A) para avançar o papel.
Commodore, Atari e (pré-Unix) Apple mantiveram o Carriage Return como símbolo de final de linha; O Unix manteve o Line Feed; e CP/M/DOS mantiveram ambos.
Muitos protocolos da Internet (por exemplo, HTTP) ainda são definidos em termos de ambos (também conhecidos como "CRLF"), mas em arquivos de texto reais, o único programa no Windows que encontrei que não lida corretamente com "apenas" uma linha O feed é o bloco de notas.
Tecnicamente, o termo “Newline” existe apenas para mascarar esta diferença histórica. Por exemplo, em C um "\n" ou em Lisp um #\Newline mapeia para qualquer notação que o sistema local preferir, em comparação com "\r" ou #\Return quando um caractere de byte específico é desejado especificamente.
Responder3
O Windows usa um retorno de carro seguido por uma nova linha. Unix apenas usa uma nova linha. Então isso é um byte extra por quebra de linha.