diferencia entre '\ n' y '\ r \ n'

93

Sí, sí, soy consciente de que '\n' escribe una nueva línea en UNIX, mientras que para Windows existe la secuencia de dos caracteres: '\r\n' . Todo esto es muy bueno en teoría, pero mi pregunta es why ? ¿Por qué el carácter de retorno de carro es adicional en Windows? Si UNIX puede hacerlo en \n , ¿por qué se necesitan dos caracteres de Windows para hacer esto?

Estoy leyendo el libro de David Beazley en Python y él dice:

  

Por ejemplo, en Windows, escribiendo el   el carácter '\ n' en realidad produce el   secuencia de dos caracteres '\ r \ n' (y   Al volver a leer el archivo, '\ r \ n' es   traducido de nuevo en un solo '\ n'   personaje).

¿Por qué el esfuerzo extra?

Seré honesto. Hace tiempo que conozco la diferencia, pero nunca me he molestado en preguntar POR QUÉ. Espero que se responda hoy.

Gracias por tu tiempo.

    
pregunta sukhbir 22.12.2010 - 12:38
fuente

8 respuestas

120

Compatibilidad con versiones anteriores.

Windows es compatible con versiones anteriores de MS-DOS (agresivamente, incluso) y MS-DOS utilizó la convención CR-LF porque MS-DOS era compatible con CP / M-80 (algo por accidente) que usaba la CR-LF convención porque así era como manejaba una impresora (porque las impresoras originalmente eran máquinas de escribir controladas por computadora).

Las impresoras tienen un comando separado para mover el papel de una línea a otra, y un comando separado para devolver el carro (donde estaba montado el papel) al margen izquierdo.

Es por eso. Y, sí, es una molestia, pero es parte del paquete que permitió a MS-DOS ganar a CP / M, y Windows 95 a ganar a todas las otras GUIs sobre DOS, y Windows XP a hacerse cargo desde Windows 98.

(Nota: las impresoras láser modernas todavía tienen estos comandos porque también son compatibles con las impresoras anteriores, en particular HP lo hace bien)

Para aquellos que no están familiarizados con las máquinas de escribir, aquí hay un video que muestra cómo se realizó la escritura: enlace . Observe que el papel se levanta primero y luego se devuelve el carro, incluso si ocurre en un movimiento simple. El ding notificó al mecanógrafo que el final estaba cerca y se preparó para ello.

    
respondido por el user1249 22.12.2010 - 13:10
fuente
19

Por lo que yo sé, esto se remonta a los días de las máquinas de escribir.

\r es el retorno de carro, que es lo que se mueve donde estás escribiendo en la página hacia la izquierda (o hacia la derecha si esa es tu cultura)

\n es una nueva línea, lo que hace que su papel suba una línea.

Hacer solo uno de estos en una máquina de escribir te colocaría en el lugar equivocado para comenzar a escribir una nueva línea de texto.

Cuando surgieron las computadoras, supongo que algunas personas conservaron el modelo anterior, pero otras se dieron cuenta de que no era necesario y encapsularon una nueva línea completa como un solo carácter.

    
respondido por el Matt Ellen 22.12.2010 - 12:45
fuente
7

Históricamente, el avance de línea significaba que la platina, el rodillo en el que escribe, giraba una línea, lo que hacía que el texto apareciera en la siguiente línea ... pero en la siguiente columna.

Retorno de carro significa "devolver el bit con el que escribe al principio de la línea".

Windows usa CR + LF porque MS-DOS sí, porque CP / M sí, porque tenía sentido para las líneas seriales.

Unix copió su convención \ n porque Multics sí.

Sospecho que si retrocedes lo suficiente, ¡encontrarás un desacuerdo político entre los implementadores!

(Dejaste el bit de diversión extra, donde la convención de Mac es (o solía ser) usar solo CR para separar líneas. Y ahora, Unicode también tiene su propio separador de línea, ¡U + 2028!)

    
respondido por el Frank Shearar 22.12.2010 - 12:40
fuente
7

No sé si esto es de conocimiento general, pero se debe tener en cuenta que los emuladores de terminales modernos aún entienden la RC:

$ printf "hey world\rsup\n"
sup world

Es útil para los indicadores de progreso, por ejemplo,

for i in {1..100}
do
    printf "\rLoading... %d%%" $i
    sleep 0.01
done
echo
    
respondido por el Daniel Lubarov 02.07.2011 - 10:01
fuente
5

Historia del personaje de nueva línea (Wikipedia):

  

ASCII fue desarrollado simultáneamente por ISO y ASA, la organización predecesora de ANSI. Durante el período de 1963–1968, el borrador de las normas ISO apoyó el uso de CR + LF o LF solo como una nueva línea, mientras que los borradores de ASA solo admitieron CR + LF.

     

La secuencia CR + LF era de uso común en muchos sistemas informáticos tempranos que habían adoptado máquinas de teletipo, generalmente un ASR33, como un dispositivo de consola, porque esta secuencia era necesaria para colocar esas impresoras al inicio de una nueva línea. En estos sistemas, el texto se compuso a menudo para ser compatible con estas impresoras, ya que el concepto de controladores de dispositivo que ocultan dichos detalles de hardware a 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 principio de la siguiente línea en un solo carácter. Es por eso que la secuencia siempre fue enviada con el CR primero. 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 de 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, para la compatibilidad con terminales más baratos que requerían múltiples tiempos de caracteres para desplazarse por la pantalla.

     

MS-DOS (1981) adoptó CR + LF de CP / M; El uso de CR + LF por parte de CP / M tenía sentido para usar terminales de computadora a través de líneas seriales. Esta convención fue heredada por el sistema operativo Windows posterior de Microsoft.

     

El sistema operativo Multics comenzó a desarrollarse en 1964 y usó LF solo como su nueva línea. Unix siguió la práctica de Multics, y los sistemas posteriores siguieron a Unix.

    
respondido por el Craige 22.12.2010 - 14:59
fuente
5

¿Qué pasa con la gente que pregunta "por qué Unix puede hacer \n y no Windows"? Es una pregunta tan extraña.

  1. El sistema operativo no tiene casi nada que ver con eso. Es más una cuestión de cómo las aplicaciones, las bibliotecas, los protocolos y los formatos de archivo tratan las cosas. Aparte de donde el sistema operativo lee / escribe la configuración basada en texto o los comandos de la línea de comandos, no tiene sentido culpar al sistema operativo.
  2. La mayoría de las aplicaciones de Windows pueden leer tanto \n como \r\n muy bien. También producen \r\n para que todos estén contentos. Un programa no simplemente "hace" o bien \n o \r\n - acepta uno, el otro, o ambos, y genera uno, el otro, o ambos.
  3. Como programador, esto realmente debería casi nunca molestarlo. Prácticamente todos los idiomas / plataformas tienen facilidades para escribir la línea final correcta y leer con la mayor robustez. La única vez que tuve que lidiar con el problema fue cuando escribí un servidor HTTP - y fue porque un determinado navegador (pista: el siguiente navegador más popular después de IE) estaba haciendo \n en lugar de el correcto \r\n .
  4. Una pregunta mucho más pertinente es, ¿por qué tantas aplicaciones modernas de Unix producen solo \n sabiendo que hay algunos protocolos y programas que no les gustan?
respondido por el Rei Miyasaka 22.12.2010 - 15:51
fuente
4

La razón por la que las convenciones se basan en sus diversos sistemas (\ n en sistemas de tipo unix, \ r \ n en Windows, etc.) es que una vez que haya elegido una convención, NO PUEDE cambiarla sin romper un montón de personas archivos. Y eso es generalmente mal visto.

Los sistemas de tipo Unix se desarrollaron (muy al principio) utilizando varios modelos de teletipo, y en algún momento alguien decidió que el equipo debería regresar cuando se hizo un salto de línea.

Windows vino de DOS, entonces para Windows la pregunta realmente es: ¿Por qué DOS usó esta secuencia cr / lf? Supongo que tiene algo que ver con CP / M, donde DOS tiene algunas de sus raíces. Una vez más, los modelos específicos de teletipo pueden haber jugado un papel.

    
respondido por el Michael Kohne 22.12.2010 - 12:54
fuente
1

Aquí hay una respuesta de la mejor fuente: Microsoft. ¿Por qué el terminador de línea CR + LF?

  

Este protocolo se remonta a los días 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 avanzar el papel. LF significa   "salto de línea": el carácter de control LF avanzó el papel una línea   Sin mover el cabezal de impresión. Así que si querías devolver la impresión.   Diríjase a la columna cero (listo para imprimir la siguiente línea) y avance la   papel (para que se imprima en papel nuevo), necesita tanto CR como LF.

     

Si va a varios documentos de protocolo de Internet, como RFC 0821   (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) o RFC 2616 (HTTP), podrá   ver que todos especifican CR + LF como la secuencia de terminación de línea. Asi que   La pregunta real no es "¿Por qué CP / M, MS-DOS y Win32 usan CR + LF?   como el terminador de línea? "sino más bien" ¿Por qué otras personas eligieron   Difieren de estos documentos estándares y utilizan alguna otra línea.   terminador? "

     

Unix adoptó LF simple como la secuencia de terminación de línea. Si miras   las opciones stty, verá que la opción onlcr especifica si un   LF debe cambiarse a CR + LF. Si te equivocas de esta configuración,   obtener el texto de la escalera, donde

each
    line
        begins
     

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

     

La ascendencia unix del lenguaje C llevó esta convención a la C   estándar de idioma, que requiere solo "\ n" (que codifica LF) para   terminar las 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 dicen que el ASCII   el comité cambió el nombre del personaje 0x0A a "nueva línea" alrededor de 1996,   por lo que el nivel de confusión se ha elevado aún más.

    
respondido por el Ondra Žižka 30.09.2017 - 07:47
fuente

Lea otras preguntas en las etiquetas