¿Por qué Windows usa CR LF?

85

Entiendo la diferencia entre los dos, así que no hay necesidad de entrar en eso, pero me pregunto cuál es el razonamiento detrás de por qué Windows usa CR y LF para indicar un salto de línea. Parece que el método Linux (solo usando LF) tiene mucho más sentido, ahorra espacio y es más fácil de analizar.

Kyle
fuente
3
Newline # History
Tim Cooper
1
Del blog de Raymond Chen: blogs.msdn.com/b/oldnewthing/archive/2004/03/18/91899.aspx
sshannin
Aquí está wikipedia sobre la historia de la nueva línea: en.wikipedia.org/wiki/Newline#History
Szocske
Vale la pena señalar que CRLF en Windows es principalmente solo una convención / predeterminado. La mayoría de los programas son compatibles con ambos (aunque es posible que tenga que modificar la configuración). Yo personalmente casi nunca uso CRLF, optando por el LF estilo UNIX; solo un puñado de programas todavía tiene problemas con archivos que solo usan LF.
Kevin
CR + LF es la forma correcta de hacerlo (es el estándar ), por lo que la pregunta no es por qué Windows lo hace correctamente sino por qué Mac y Unix / Linux lo hacen incorrectamente. El legado de Standalone LF es la pereza y tomar un atajo. Siempre hago CR + LF, excepto por ciertas cosas de Linux que miran boquiabierto a CR + LF, así que cambio al modo LF para eso. En mi opinión, malinterpretar CR + LF es mucho peor que malinterpretar un LF independiente.
InterLinked

Respuestas:

96

Históricamente al usar impresoras matriciales Los teletipos CR devolverían el carro a la primera posición de la línea, mientras que LF pasaría a la siguiente línea. El uso de CR + LF en el propio archivo hizo posible enviar un archivo directamente a la impresora, sin ningún tipo de controlador de impresora.

Gracias @zaph señalando que eran teletipos y no impresoras matriciales

Anders Abel
fuente
46
Molestia muy común por muy poco beneficio.
Dávid Horváth
7
@Anders En realidad, fueron los teletipos la razón, CR devolvió el cabezal de impresión a la izquierda y LF avanzó el papel. Los teletipos precedieron a las impresoras matriciales.
zaph
5
@zaph Por eso me encanta Stack Overflow. 2 años después, recibí una corrección y aprendí algo nuevo.
Anders Abel
30

@sshannin publicó una URL del blog de Raymond Chen, pero ya no funciona. El blog ha cambiado su software interno, por lo que las URL cambiaron.

Después de rastrear las publicaciones antiguas en el nuevo blog, lo encontré aquí .

Cita del blog:

¿Por qué el terminador de línea es CR + LF?

Este protocolo se remonta a la época de los teletipos. CR significa "retorno de carro": el carácter de control CR devolvió el cabezal de impresión ("carro") a la columna 0 sin hacer avanzar el papel. LF son las siglas de "linefeed": el carácter de control LF avanzó el papel una línea sin mover el cabezal de impresión. Entonces, si desea regresar el cabezal de impresión a la columna cero (listo para imprimir la siguiente línea) y hacer avanzar el papel (para que imprima en papel nuevo), necesita tanto CR como LF.

Si accede a los diversos documentos de protocolo de Internet, como RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) o RFC 2616 (HTTP), verá que todos especifican CR + LF como secuencia de terminación de línea. Entonces, la pregunta real no es "¿Por qué CP / M, MS-DOS y Win32 usan CR + LF como terminador de línea?" sino más bien "¿Por qué otras personas optaron por diferir de estos documentos de estándares y utilizar algún otro terminador de línea?"

Unix adoptó LF simple como secuencia de terminación de línea. Si observa las opciones stty, verá que la opción onlcr especifica si un LF debe cambiarse a CR + LF. Si se equivoca en esta configuración, obtendrá un texto de escalón, donde

each
    line
        begins 

donde se quedó la línea anterior. Entonces, incluso unix, cuando se deja en modo sin formato, requiere CR + LF para terminar líneas. El CR implícito antes de LF es una invención de Unix, probablemente como economía, ya que ahorra un byte por línea.

La ascendencia Unix del lenguaje C llevó esta convención al estándar del lenguaje C, que requiere solo "\ n" (que codifica LF) para terminar líneas, poniendo la carga en las bibliotecas de tiempo de ejecución para convertir datos de archivos sin procesar en líneas lógicas.

El lenguaje C también introdujo el término "nueva línea" para expresar el concepto de "terminador de línea genérico". Me dijeron que el comité ASCII cambió el nombre del carácter 0x0A a "nueva línea" alrededor de 1996, por lo que el nivel de confusión se ha elevado aún más.

Aquí hay otra discusión sobre el tema, desde una perspectiva de Unix.

Cambié este segundo enlace a una instantánea en The Wayback Machine, ya que la página real ya no está disponible.

Espero que esto responda tu pregunta.

OMA
fuente
Dado que en realidad no está respondiendo la pregunta, solo está corrigiendo un enlace, que se ha vuelto obsoleto, en un comentario , esto realmente debería ser un comentario. De todos modos, gracias por el enlace correcto. Agréguelo como comentario, esta respuesta puede eliminarse.
Tom Brunberg
1
De acuerdo, agregué aquí el texto del blog, así que si el enlace vuelve a fallar, el texto todavía está disponible aquí. Creo que esto debería mantenerse como una respuesta, no solo como un comentario, ya que esta información realmente responde a la pregunta que se hizo originalmente.
OMA
7
Yo realmente odio la forma en que Microsoft obsoletes sus enlaces en una base regular.
Mark Ransom
1
Esta respuesta es más detallada que la excepción y responde no solo a la pregunta, sino a la razón adivinada de la pregunta, en mi humilde opinión, es mejor.
Alexei Martianov
18

Viene de las máquinas de teletipo (y máquinas de escribir) de antaño.

Solía ​​ser que cuando terminaba de escribir una línea, tenía que mover el carro de la máquina de escribir (que sostenía el papel y se deslizaba hacia la izquierda mientras escribía) de regreso al inicio de la línea (CR). Luego, tuvo que avanzar el papel una línea (LF) para pasar a la siguiente línea.

Hay casos en los que es posible que no haya querido saltar de línea al devolver el carro, como si fuera a tachar un carácter con un guión (simplemente lo sobrescribiría).

Pero básicamente, se reduce a lo convencional. DOS usó la convención CR / LF completa y UNIX la acortó un poco. ¡Ahora estamos atascados!

Dave Markle
fuente
2

Otros han dado la respuesta, pero yo quería agregar ... ¿Supongo que eres demasiado joven para haber usado una máquina de escribir? ;) El carro es un tambor. Moviéndolo horizontalmente hacia la derecha, el encabezado del tipo estacionario regresa al margen izquierdo de la página. Al girar el carro con el dedo índice y el pulgar, la página avanza una línea (s).

likejudo
fuente
2
¿Máquina de escribir? Creo que vi uno de esos en un museo una vez :)
Kyle
@Kyle Tuve que reír y esto iluminó mi día :)
likejudo
1

De Wikipedia :

La secuencia CR + LF era de uso común en muchos de los primeros sistemas informáticos que habían adoptado máquinas de teletipo, generalmente un ASR33, como dispositivo de consola, porque esta secuencia era necesaria para colocar esas impresoras al comienzo de una nueva línea.

Nick Heidke
fuente
1

He visto más de una cuenta en el sentido de que la razón para enviar dos caracteres (y a veces más) en lugar de uno era para hacer coincidir mejor la velocidad de transferencia de datos con la velocidad de impresión física ( esto fue hace mucho tiempo ). Mover el cabezal de impresión tomó más tiempo que imprimir un solo carácter y enviar caracteres adicionales fue una forma de evitar que la transferencia de datos se adelantara al dispositivo de impresión. Entonces, la razón por la que tenemos varios caracteres para el final de línea en Windows es básicamente la misma que la razón por la que tenemos teclados QWERTY: tenía la intención de ralentizar las cosas .

Obviamente, la razón por la que esta práctica continúa en Windows hasta el día de hoy se basa en alguna noción de compatibilidad con versiones anteriores y, en última instancia, simplemente en una simple inercia.

Sin embargo, cabe destacar que Windows no aplica estrictamente esta convención a nivel del sistema operativo . Cualquier aplicación de Windows es libre de ignorar la convención, dependiendo de con qué otras aplicaciones esté tratando de ser compatible.

Curiosamente, el artículo de Wikipedia sobre "Newline" afirma que Windows 8 puede introducir un cambio para usar solo LF. El artículo también afirma que Mac OS X introdujo una transición de LF + CR a solo LF.

Brent Bradburn
fuente
4
"Destinado a ralentizar las cosas" - cita requerida.
Elliot Gorokhovsky
4
En realidad, todo el primer párrafo - cita requerida.
Elliot Gorokhovsky
2
Aquí hay un artículo de Jeff Atwood estrechamente relacionado que hace referencia al mismo contenido de Wikipedia: The Great Newline Schism . También hay muchos comentarios inteligentes de los usuarios, incluida alguna prueba de mi punto de que esto no es una preocupación a nivel del sistema operativo y que la mayoría de las aplicaciones de Windows funcionarán bien con archivos de texto solo LF. También está el comentario divertido: "Windows 10 usa CR / LF para mantener la compatibilidad con la máquina de teletipo Modelo 33 de 1963 ".
Brent Bradburn
1
@ RenéG No necesito una citación, estuve allí y lo vi por mí mismo. Algunas de las primeras impresoras matriciales de puntos requerían incluso algunos NUL adicionales en buena medida, porque a medida que aumentaba la velocidad en baudios de la interfaz, el cabezal no podía mantenerse al día ni siquiera con dos caracteres de tiempo. Ese problema desapareció cuando el almacenamiento en búfer y el control de flujo entraron en escena, pero las primeras impresoras no tenían eso. Finalmente, cuando las impresoras pasaron a ser solo salida, pasaron a una interfaz paralela que tenía un protocolo de enlace integrado.
Mark Ransom
1
“Contrariamente a la creencia popular, el diseño QWERTY no fue diseñado para ralentizar al mecanógrafo,…” - Propiedades | QWERTY - Wikipedia
Jason Sparc