¿Diferencia entre los tipos de salto de línea CR LF, LF y CR?

760

Me gustaría saber la diferencia (con ejemplos si es posible) entre los tipos de salto de línea CR LF (Windows), LF (Unix) y CR (Macintosh).

eozzy
fuente
99
Muy similar, pero no un duplicado exacto . \nnormalmente está representado por un salto de línea, pero no es necesariamente un salto de línea.
Adrian McCarthy
92
CR y LF son caracteres de control ASCII y Unicode \ry \nson abstracciones utilizadas en ciertos lenguajes de programación. Cerrar esta pregunta pasa por alto las diferencias fundamentales entre las preguntas y perpetúa la desinformación.
Adrian McCarthy
55
@AdrianMcCarthy Es un problema con la forma en que los votos cerrados actúan como respuestas de alguna manera; una respuesta afirmando que los dos eran iguales podría ser rechazada y luego atenuada como muy, muy incorrecta, pero solo se necesitan 4 votos de acuerdo (comparables a las votaciones positivas) para que se produzca un cierre muy incorrecto, sin forma de contrarrestar la votación hasta después Está pasando.
Jon Hanna
Esta formulación de la pregunta es ciertamente mejor, pero sigue siendo para todos los fines prácticos la misma pregunta.
Jukka K. Korpela
66
@ JukkaK.Korpela: No, realmente no lo es. \nno significa lo mismo en todos los lenguajes de programación.
Adrian McCarthy

Respuestas:

349

Realmente se trata de qué bytes se almacenan en un archivo. CRes un código de bytes para el retorno de carro (desde los días de las máquinas de escribir) y LF, de manera similar, para el avance de línea. Simplemente se refiere a los bytes que se colocan como marcadores de fin de línea.

Mucho más información, como siempre, en wikipedia .

Peter
fuente
53
Creo que también es útil mencionar que CRes el personaje de escape \ry LFes el personaje de escape \n. Además, Wikipedia: Newline .
Robert Vunabandi
1
En palabras simples CR and LFes solo el final de la línea y la nueva línea de acuerdo con este enlace , ¿es esto correcto?
shaijut
@shaijut CR significa retorno de carro. Eso fue lo que devolvió el carruaje en máquinas de escribir. Entonces, mayormente correcto.
AliFurkan
764

CR y LF son caracteres de control, respectivamente codificados 0x0D(13 decimales) y 0x0A(10 decimales).

Se utilizan para marcar un salto de línea en un archivo de texto. Como indicó, Windows usa dos caracteres de la secuencia CR LF; Unix solo usa LF y el viejo MacOS (pre-OSX MacIntosh) usaba CR.

Una perspectiva histórica apócrifa:

Como lo indicó Peter , CR = retorno de carro y LF = avance de línea , dos expresiones tienen sus raíces en las viejas máquinas de escribir / TTY. LF movió el papel hacia arriba (pero mantuvo la posición horizontal idéntica) y CR recuperó el "carro" para que el siguiente carácter escrito estuviera en la posición más a la izquierda del papel (pero en la misma línea). CR + LF estaba haciendo ambas cosas, es decir, preparándose para escribir una nueva línea. A medida que pasaba el tiempo, la semántica física de los códigos no era aplicable, y como la memoria y el espacio en el disquete eran muy importantes, algunos diseñadores de sistemas operativos decidieron usar solo uno de los caracteres, simplemente no se comunicaban muy bien entre ellos; -)

La mayoría de los editores de texto modernos y las aplicaciones orientadas a texto ofrecen opciones / configuraciones, etc. que permiten la detección automática de la convención de fin de línea del archivo y mostrarlo en consecuencia.

mjv
fuente
11
así que en realidad Windows es el único sistema operativo que utiliza estos caracteres correctamente, Carriage Return, seguido de un avance de línea.
Rolf
44
¿Sería exacto, entonces, decir que un archivo de texto creado en Windows es el más compatible de los tres, es decir, el más probable de mostrar en los tres subconjuntos del sistema operativo?
Prometeo
3
@Hashim podría mostrarse correctamente, pero intentar ejecutar un script de shell textual con retornos de carro generalmente generará un error
Omer
En palabras simples CR and LFes solo el final de la línea y la nueva línea de acuerdo con este enlace , ¿es esto correcto?
shaijut
Descubrí que algunos archivos de estilo Windows ( CR+LF) pueden mostrarse con líneas nuevas dobles en otros sistemas. Presumiblemente, el editor que muestra el texto admite el retorno de carro y el avance de línea como delimitadores de nueva línea y, como tal, puede crear 2 líneas donde se pretendía 1. Entonces, aunque CR+LFpodría ser el más compatible, no creo que sea sin problemas.
Magnus Bull
459

Este es un buen resumen que encontré:

El carácter de retorno de carro (CR) ( 0x0D, \r) mueve el cursor al comienzo de la línea sin avanzar a la siguiente línea. Este carácter se utiliza como un nuevo carácter de línea en los sistemas operativos Commodore y Early Macintosh (OS-9 y versiones anteriores).

El carácter de avance de línea (LF) ( 0x0A, \n) mueve el cursor hacia abajo a la siguiente línea sin volver al principio de la línea. Este carácter se utiliza como un nuevo carácter de línea en sistemas basados ​​en UNIX (Linux, Mac OSX, etc.)

La secuencia de fin de línea (EOL) ( 0x0D 0x0A, \r\n) es en realidad dos caracteres ASCII, una combinación de los caracteres CR y LF. Mueve el cursor hacia abajo a la siguiente línea y al comienzo de esa línea. Este carácter se utiliza como un nuevo carácter de línea en la mayoría de los sistemas operativos que no son Unix, incluidos Microsoft Windows, Symbian OS y otros.

Fuente

Taylor Leese
fuente
1
El carácter de "pestaña vertical" mueve el cursor hacia abajo y mantiene la posición en la línea, no el carácter LF. El LF es EOL.
12431234123412341234123
2
@TaylorLeese ¿Son / r / ny / n / r iguales?
Vicrobot
175

Como no hay una respuesta que indique esto, resumido sucintamente:

Retorno de carro (MAC pre-OSX)

  • CR
  • \ r
  • Código ASCII 13

Alimentación de línea (Linux, MAC OSX)

  • LF
  • \norte
  • Código ASCII 10

Retorno de carro y avance de línea (Windows)

  • CRLF
  • \ r \ n
  • Código ASCII 13 y luego código ASCII 10

Si ve el código ASCII en un formato extraño, son simplemente el número 13 y 10 en una base / base diferente, generalmente base 8 (octal) o base 16 (hexadecimal).

http://www.bluesock.org/~willg/dev/ascii.html

ahnbizcad
fuente
46

Jeff Atwood tiene una publicación de blog reciente sobre esto: The Great Newline Schism

Aquí está la esencia de Wikipedia :

La secuencia CR + LF era de uso común en muchos sistemas informáticos tempranos que habían adoptado máquinas de teletipo, típicamente un ASR33, como dispositivo de consola, porque esta secuencia era necesaria para colocar esas impresoras al comienzo de una nueva línea. En estos sistemas, el texto a menudo se componía habitualmente para ser compatible con estas impresoras, ya que el concepto de controladores de dispositivo que ocultaban dichos detalles de hardware de la aplicación aún no estaba bien desarrollado; Las aplicaciones tenían que hablar directamente con la máquina de teletipo y seguir sus convenciones.La separación de las dos funciones ocultaba el hecho de que el cabezal de impresión no podía regresar desde el extremo derecho al comienzo de la siguiente línea en el tiempo de un carácter. Es por eso que la secuencia siempre se envió primero con el CR. De hecho, a menudo era necesario enviar caracteres adicionales (CR o NUL extraños, que se ignoran) para dar tiempo al cabezal de impresión para moverse al margen izquierdo. Incluso después de que los teletipos fueron reemplazados por terminales de computadora con velocidades de transmisión más altas, muchos sistemas operativos aún admitían el envío automático de estos caracteres de relleno, por compatibilidad con terminales más baratos que requerían tiempos de caracteres múltiples para desplazar la pantalla.

Manu
fuente
55
+1 Es por esta simple comprensión que siempre recuerdo en qué orden viene la combinación. Incluso hoy todavía podemos ver esta lógica mecánica en cualquier impresora de inyección de tinta (me encanta entender ya que odio aprender). Mis otros trucos de memoria son: "mac? Volver al remitente" y "NewLineFeed" (para recordar que NL === LF y para recordar el \ n, ya que CR ya tiene la R en su abreviatura)
GitaarLAB
3
"Tengo dudas ... dos códigos de control fueron necesarios para el tiempo". Eso no es lo que dice. Dice que los CR y NUL adicionales están aquí para dar tiempo a que regrese, no el CR LF original.
Julien Rousseau
11
@Adrian ¿Tomarás experiencia personal? 1) En mis viejos días de teletipo, requería la impresora que usábamos <CR><CR><LF>, así que, por supuesto, experimenté con solo una <CR>. Envié <CR><LF>Adespués de una larga fila, y se podía escuchar la Aimpresión antes de que el carro regresara por completo.
John Burger
11
@ Adrian 2) No lo olvides, esto fue en la era electromecánica, donde cada personaje realizaba exactamente una función. A menudo enfatizamos una palabra imprimiendo la línea, luego enviando <CR><CR>y escribiendo el número correcto de espacios, luego reimprimiendo la misma palabra: una forma primitiva de negrita.
John Burger
3
@Adrian 3) Y finalmente, esto estaba usando Baudot (o código Murray), no ASCII. Cinco bits de datos, entre un bit de inicio y uno y medio bits de parada. ¿Cómo puedes tener medio poco? Esperando medio tiempo antes de comenzar a enviar el siguiente carácter, para darle tiempo al cabezal de impresión para que vuelva al centro.
John Burger
16

CR - Código ASCII 13

LF - Código ASCII 10.

Teóricamente, CR devuelve el cursor a la primera posición (a la izquierda). LF alimenta una línea moviendo el cursor una línea hacia abajo. Así es como en los viejos tiempos controlabas las impresoras y los monitores en modo texto. Estos caracteres generalmente se usan para marcar el final de las líneas en los archivos de texto. Diferentes sistemas operativos utilizan diferentes convenciones. Como señaló, Windows usa la combinación CR / LF, mientras que las Macs anteriores a OSX usan solo CR, etc.

DmitryK
fuente
7

Los sistemas basados ​​en ASCII o un juego de caracteres compatible usan LF (avance de línea, 0x0A, 10 en decimal) o CR (retorno de carro, 0x0D, 13 en decimal) individualmente, o CR seguido de LF (CR + LF, 0x0D 0x0A); Estos caracteres se basan en los comandos de la impresora: el avance de línea indica que una línea de papel debe salir de la impresora, y un retorno de carro indica que el carro de la impresora debe regresar al comienzo de la línea actual.

Aquí están los detalles .

pierrotlefou
fuente
5

El triste estado de los "separadores de registros" o "terminadores de línea" es un legado de las edades oscuras de la informática.

Ahora, damos por sentado que todo lo que queremos representar es de alguna manera datos estructurados y se ajusta a varias abstracciones que definen líneas, archivos, protocolos, mensajes, marcas, lo que sea.

Pero había una vez que esto no era exactamente cierto. Aplicaciones de caracteres de control integrados y procesamiento específico del dispositivo. Los sistemas con muerte cerebral que requerían tanto CR como LF simplemente no tenían abstracción para separadores de registros o terminadores de línea. El CR era necesario para que el teletipo o la pantalla de video volvieran a la columna uno y el LF (hoy, NL, el mismo código) era necesario para avanzar a la siguiente línea. Supongo que la idea de hacer algo más que descargar los datos sin procesar en el dispositivo era demasiado compleja.

Unix y Mac en realidad especificaron una abstracción para el final de línea, imagínense eso. Lamentablemente, especificaron diferentes. (Unix, ejem, vino primero.) Y, naturalmente, utilizaron un código de control que ya estaba "cerca" de SOP

Dado que casi todo nuestro software operativo hoy en día es un descendiente de SW operativo de Unix, Mac o MS, estamos atrapados con la línea que termina con la confusión.

DigitalRoss
fuente
1

NL derivado de EBCDIC NL = x'15 'que lógicamente se compararía con CRLF x'odoa ascii ... esto se hace evidente cuando se mueven físicamente datos de mainframes a rango medio. Coloquialmente (como solo las personas arcanas usan ebcdic) NL se ha equiparado con CR o LF o CRLF

david
fuente