Así que creé dos archivos, cada uno con 127.955 líneas y 24 caracteres aleatorios por línea. En cuanto al texto, los dos archivos eran completamente idénticos. Sin embargo, un archivo tenía saltos de línea de Unix y el otro tenía saltos de línea de Windows. El archivo con saltos de línea Unix tenía un tamaño de 3.124 KB, mientras que el archivo con saltos de línea de Windows tenía un tamaño de 3.249 KB. No hubo otras diferencias entre los archivos, así que debo suponer que, por alguna razón, los saltos de línea de Windows ocupan más espacio. ¿Alguna idea de por qué?
Respuesta1
Si abrieras los archivos de texto en el editor hexadecimal, la diferencia que verías al final de una línea sería la siguiente:
Finales de línea de Windows:0x0D 0x0A
Finales de línea Unix:0x0A
Es 0x0D
el valor hexadecimal del retorno de carro (representado textualmente simplemente como \r
).
Es 0x0A
el valor hexadecimal para el carácter de nueva línea (representado textualmente simplemente como \n
).
Cuando los finales de línea están en formato EOL de Windows, las líneas terminarán con 2 caracteres: \r\n
; mientras que el formato Unix EOL termina con 1 carácter: \n
.
Entonces, 127,955 * (24 + 1) == 3,198,875 bytes (3,123.9 KB)
para Unix EOL y 127,955 * (24 + 2) == 3,326,830 bytes (3,248.86 KB)
para Windows EOL.
Espero que ayude.
Respuesta2
En cuanto al bit real del "por qué": históricamente, un teletipo usaba el retorno de carro (hex 0D) para mover el cabezal de impresión hacia el margen izquierdo, seguido de un avance de línea (hex 0A) para hacer avanzar el papel.
Commodore, Atari y Apple (antes de Unix) mantuvieron el retorno de carro como símbolo de final de línea; Unix mantuvo el avance de línea; y CP/M/DOS mantuvo ambos.
Muchos protocolos de Internet (por ejemplo, HTTP) todavía están definidos en términos de ambos (también conocido como "CRLF"), pero en archivos de texto reales, el único programa en Windows que he encontrado que no trata correctamente "solo" una línea. El feed es el Bloc de notas.
Técnicamente, el término "Nueva línea" existe sólo para enmascarar esta diferencia histórica. Por ejemplo, en C, "\n" o en Lisp, #\Newline se asigna a cualquier notación que prefiera el sistema local, en comparación con "\r" o #\Return cuando se desea específicamente un carácter de byte en particular.
Respuesta3
Windows utiliza un retorno de carro seguido de una nueva línea. Unix solo usa una nueva línea. Entonces eso es un byte extra por salto de línea.