¿Diferencia entre \ n y \ r?

609

¿Cuál es la diferencia entre \n(nueva línea) y \r(retorno de carro)?

En particular, ¿hay alguna diferencia práctica entre \ny \r? ¿Hay lugares donde se debe usar uno en lugar del otro?

eozzy
fuente
3
Todas las respuestas son bastante predecibles, pero me interesaría saber si existen diferencias PRÁCTICAS entre \ n y \ r. ¿Hay lugares donde uno debe usarse sobre el otro?
Vlad the Impala
99
bueno, sí, los archivos de texto con solo LF (nueva línea) no se verán terminados en algunas aplicaciones de Windows, y los archivos de texto terminados con CRLF parecerán tener caracteres adicionales si se abren en algunas aplicaciones de Linus.
Pavium
2
Sí, algunas aplicaciones de consola de Linux usan \ r para hacer animación de línea giratoria.
Murali
8
¿Sigue siendo realmente la EOL normal de Mac? Estoy seguro de que era para Mac "clásico", pero pensé que OS X se había Unixified. (Muestra lo familiar que estoy con las Mac, ¿eh?)
John Y
11
históricamente se usaba \ n para mover el carro hacia abajo, mientras que \ r se usaba para mover el carro de regreso al lado izquierdo de la página.
karthik gorijavolu

Respuestas:

827

En términos de código ASCII, es 3, ya que son 10 y 13 respectivamente ;-).

Pero en serio, hay muchos:

  • en Unix y en todos los sistemas similares a Unix, \nes el código para el final de línea, \rno significa nada especial
  • Como consecuencia, en C y en la mayoría de los lenguajes que de alguna manera lo copian (incluso de forma remota), \nes la secuencia de escape estándar para el final de línea (traducida a / desde secuencias específicas del sistema operativo según sea necesario)
  • en sistemas Mac antiguos (pre-OS X), \rera el código para el final de línea
  • en Windows (y muchos sistemas operativos antiguos), el código para el final de línea es de 2 caracteres \r\n, en este orden
  • Como consecuencia (sorprendente ;-) (volver a sistemas operativos mucho más antiguos que Windows), \r\nes la terminación de línea estándar para formatos de texto en Internet
  • para "terminales" electromecánicos tipo teletipo, \rordena al carro que retroceda hacia la izquierda hasta llegar al tope más a la izquierda (una operación lenta), \nordena al rodillo que ruede hacia arriba una línea (una operación mucho más rápida) - esa es la razón por la que siempre tiene \r ¡antes \n , para que el rodillo pueda moverse mientras el carro aún se mueve hacia la izquierda! -) Wikipedia tiene una explicación más detallada .
  • para terminales de modo de carácter (típicamente emulando los de impresión incluso-mayores como más arriba), en modo sin procesar, \ry \nactuar de manera similar (excepto tanto en términos de la cursor, ya que no es ningún carro o rodillo ;-)

En la práctica, en el contexto moderno de escribir en un archivo de texto, siempre debe usar \n(el tiempo de ejecución subyacente lo traducirá si está en un sistema operativo extraño, por ejemplo, Windows ;-). La única razón para usar \res si está escribiendo en un terminal de caracteres (o más probablemente una "ventana de consola" que lo emula) y desea que la siguiente línea que escriba sobrescriba la última que acaba de escribir (a veces utilizada para una animación ascii tonta) "efectos de, por ejemplo, barras de progreso) - esto se está volviendo bastante obsoleto en un mundo de GUI, sin embargo ;-).

Alex Martelli
fuente
12
Para agregar al historial en esta respuesta: a medida que las velocidades de línea aumentaron de 10 caracteres por segundo, el carro tardó más de 2 caracteres en regresar y \0se agregaron caracteres inofensivos adicionales (generalmente NUL, es decir ) después \nde permitir el extra hora. Esto fue manejado de manera transparente por el sistema operativo, por lo que no encontrará rastros en el código heredado.
Mark Ransom
11
¿Cómo es Windows un sistema operativo 'extraño'?
mailmindlin
31
@mailmindlin: preguntas "¿Cómo es Windows un sistema operativo" extraño "?". Respuesta: en más formas de las que puedo contar fácilmente (mientras uso calcetines, por lo que los dedos de los pies no están permitidos :-). Todos los demás sistemas operativos supervivientes están basados ​​en Unix ... Windows es el único, SALIÓ de muchas maneras. En el contexto de esta Q específica: es el único que presenta DOS bytes (\ n \ r) como el final de línea canónico ... sin ninguna razón sensata, excepto los antiguos históricos explicados en otra parte del hilo ... todos los demás sistemas operativos tiene un solo extremo de línea char a5 (99% + de ellos `\ n ').
Alex Martelli
1
@notisnenecesario: por ejemplo, tools.ietf.org/html/rfc5322 , que reemplazó a RFC 2822, que define el formato de los mensajes de correo electrónico.
Keith Thompson el
3
Un pequeño consejo para todos los que escribirán un analizador de algún tipo en algún momento de sus vidas: nunca olviden manejar adecuadamente el final de las líneas. Tuve una experiencia bastante desagradable con eso solo porque olvidé el \r(estoy usando Linux). Una vez que comencé a analizar lo que parecía ser un archivo válido, mi analizador falló porque el archivo que estaba analizando se creó en Windows. : D El principal problema en todo lo que es que ni \no \rson visibles en el sentido de que, por ejemplo a, ., (etc. personajes son.
rbaleksandar
122

Históricamente, \nse usaba para mover el carro hacia abajo, mientras que \rse usaba para mover el carro de regreso al lado izquierdo de la página.

tster
fuente
8
Quizás no sea una respuesta terriblemente práctica a una pregunta de computadora, pero el tidbit histórico recibe un voto positivo de mí de todos modos.
John Y
1
Imagine que es similar a cuando empuja la parte de escritura de su máquina de escribir física hacia la izquierda aka. regreso.
Jo Smo
2
\ n no mueve el carro hacia abajo, gira el rodillo para mover el papel hacia ARRIBA.
Roddy
55
Todo movimiento es relativo. El periódico es mi mundo y, en relación con él, el carro se mueve hacia abajo: P
tster
2
FWIW, \ r todavía puede ser un "retorno de carro" en los sistemas modernos. Considere este código C printf("abcdefghijlm\rNOP\n");Compilado con gcc-8 en OpenSuSe y ejecutado en un terminal da como resultado esta salida NOPdefghijlm. ¡El \ r (retorno de carro) en la cadena da como resultado que el cursor se mueva al comienzo de la línea (carro) y los caracteres que siguen al \ r (es decir, "NOP") sobrescriben lo que estaba previamente allí (es decir, el "abc")! Puede lograr un "movimiento de carro" similar con retroceso (\ b) como el printf("abcdefghijlm\b\bNOP\n");que produceabcdefghijNOP
GMc
36

Dos personajes diferentes

\n se utiliza como un terminador de fin de línea en archivos de texto Unix

\r se utiliza como un terminador de fin de línea en archivos de texto de Mac

\r\n (es decir, ambos) se utilizan para terminar líneas en archivos de texto de Windows y DOS.

pavium
fuente
2
Observe que hay / hubo computadoras que usaron \ n \ r como marcador de final de línea cuando presionó la tecla ENTER, Like Acorn y RISC OS.
Anders
99
Para aclarar: \rno ha sido el final de línea en una Mac durante mucho tiempo. Con el lanzamiento de Mac OS X en 2001 (que está basado en Unix), \nahora se usa.
jbbuckley
3
Pero todavía hay algunas aplicaciones que usan \r, por ejemplo, MS Office 2011 Excel: guardar un CSV (con todas las configuraciones predeterminadas) guardará un archivo codificado ISO-8859-1 con \rterminaciones de línea.
CodeBrauer
24

Como nadie más lo mencionó específicamente (¿son demasiado jóvenes para saberlo / recordarlo?), Sospecho que el uso se \r\noriginó para máquinas de escribir y dispositivos similares.

Cuando quería una nueva línea mientras usaba una máquina de escribir con capacidad para varias líneas, había dos acciones físicas que tenía que realizar: deslice el carro hacia el principio (izquierda, en EE. UU.) De la página y alimente el papel una muesca .

En los días de las impresoras lineales, la única forma de hacer texto en negrita, por ejemplo, era hacer un retorno de carro SIN una nueva línea e imprimir los mismos caracteres sobre los antiguos, agregando así más tinta, haciendo que parezca más oscuro (en negrita) . Cuando la función mecánica de "nueva línea" fallaba en una máquina de escribir, este era el resultado molesto: podía escribir sobre la línea de texto anterior si no estaba prestando atención.

nada es necesario
fuente
3
El estándar ASCII para nueva línea es \ r \ n. (Aparte de un breve intervalo cuando Bell Telephone obtuvo el control del comité de normas). A cambio del monopolio telefónico, Bell Telephone abandonó el negocio de mensajería (telegrama, teletipo) y no le importó el uso existente del estándar. HTTP, HTML, PCDOS y MSDOS usaron el estándar ASCII. Bell Telephone decidió no ser estándar para Unix porque no tenían un negocio existente para ser compatible.
david
12

Dos personajes diferentes para diferentes sistemas operativos. Además, esto juega un papel en los datos transmitidos TCP/IPque requieren el uso de\r\n .

\n Unix

\r Mac

\r\n Windows y DOS.

a432511
fuente
10
Creo que está confundiendo con los protocolos de aplicación, TCP / IP no tiene idea de \ ny \ r.
jean-loup
44
TCP / IP no requiere el uso de \ r \ n. Varios protocolos basados ​​en Telnet lo requieren, incluidos SMTP, POP3, FTP, HTTP, ...
Marqués de Lorne
9

Completar,

En una secuencia de comandos de shell (bash), puede usar \rpara enviar el cursor, al frente en línea y, por supuesto, \npara colocar el cursor en una nueva línea.

Por ejemplo, intente:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • La primera pantalla de "eco" AA--AA
  • El segundo : AA--AABB
  • El último : BB--AABB

Pero no te olvides de usar -encomo parámetros.

Akarun
fuente
5

En Windows, el \ n se mueve al comienzo de la siguiente línea. El \ r se mueve al comienzo de la línea actual, sin moverse a la línea siguiente. He usado \ r en mis propias aplicaciones de consola donde estoy probando un código y no quiero ver texto desplazándose por mi pantalla, así que en lugar de usar \ n después de imprimir algo de texto, por ejemplo, una velocidad de fotogramas ( FPS), imprimiré f ("% - 10d \ r", fps); Esto devolverá el cursor al comienzo de la línea sin moverse a la siguiente línea y me permitirá tener otra información en la pantalla que no se desplaza mientras la velocidad de cuadros se actualiza constantemente en la misma línea (el% -10 hace seguro de que la salida tiene al menos 10 caracteres, se justifica a la izquierda para que quede rellenada por espacios, sobrescribiendo los valores antiguos de esa línea). Es bastante útil para cosas como esta,

Una pequeña historia

El / r significa "retorno" o "retorno de carro" que debe su historial a la máquina de escribir. Un retorno de carro movió su carro completamente hacia la derecha, por lo que estaba escribiendo al comienzo de la línea.

El / n significa "nueva línea", nuevamente, desde los días de máquina de escribir que movió a una nueva línea. Sin embargo, no es muy común al principio, por lo que algunos sistemas operativos adoptaron la necesidad de un retorno a / r seguido de una nueva línea / n, ya que ese fue el orden en que lo hizo una máquina de escribir. También explica las viejas computadoras de 8 bits que usaban tener "Retorno" en lugar de "Enter", de "retorno de carro", que era familiar.

Neil Roy
fuente
1

Solo para agregar a la confusión, he estado trabajando en un editor de texto simple usando un elemento TextArea en una página HTML en un navegador. En previsión de problemas de compatibilidad con respecto a CR / LF, escribí el código para verificar la plataforma y usar cualquier convención de nueva línea que sea aplicable a la plataforma.

Sin embargo, descubrí algo interesante al verificar los caracteres reales contenidos en TextArea, a través de una pequeña función de JavaScript que genera los datos hexadecimales correspondientes a los caracteres.

Para la prueba, escribí el siguiente texto:

Hola mundo [enter]

Adiós, mundo cruel [entrar]

Cuando examiné los datos del texto, la secuencia de bytes que obtuve fue la siguiente:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

Ahora, la mayoría de las personas que miran esto y ven 0a pero no 0d bytes, pensarían que esta salida se obtuvo en una plataforma Unix / Linux. Pero, aquí está el problema: esta secuencia la obtuve en Google Chrome en Windows 7 de 64 bits.

Por lo tanto, si está utilizando un elemento TextArea y examina el texto, COMPRUEBE la salida como lo hice anteriormente, para asegurarse de qué bytes de caracteres reales devuelve su TextArea. Todavía tengo que ver si esto difiere en otras plataformas u otros navegadores, pero vale la pena tener en cuenta si está realizando el procesamiento de texto a través de JavaScript, y necesita hacer que esa plataforma de procesamiento de texto sea independiente.

Las convenciones cubiertas en las publicaciones anteriores se aplican a la salida de la consola , pero los elementos HTML, al parecer, se adhieren a la convención UNIX / Linux. A menos que alguien descubra lo contrario en una plataforma / navegador diferente.

David Edwards
fuente
0
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

tomemos este ejemplo, intente poner \ n en lugar de \ r no funcionará e intente adivinar por qué.

karthik gorijavolu
fuente
1
Esto solo funciona si su sistema operativo subrayado envía \ r \ n cuando presiona la tecla ENTER, como MS DOS, DECS TOPS-10, CP / M, RT-11, etc. En el sistema operativo: es como Multic, Unix y Unix-like ( Linux, Minix, etc.) La tecla BeOS, RISCOS, etc. ENTER solo le envía un \ n carácter.
Anders
1
ahh sí, los buenos viejos tiempos cuando los teclados solían tener ambos Returny Enter. Incluso mi teclado inalámbrico moderno todavía muestra la flecha hacia abajo y hacia atrás en la Returntecla anterior (que ahora se titula "Enter" para ser coherente con la Entertecla del teclado numérico , que no muestra la flecha)
necesita nada el
0

¿Cuál es la diferencia entre \ n (nueva línea) y \ r (retorno de carro)?

En particular, ¿hay alguna diferencia práctica entre \ny \r? ¿Hay lugares donde se debe usar uno en lugar del otro?


Me gustaría hacer un breve experimento con las respectivas secuencias de escape de \nfor newline y\r para retorno de carro para ilustrar dónde está la diferencia distintiva entre ellas.

Sé que esta pregunta se hizo como idioma independiente. No obstante, necesitamos un idioma al menos para cumplir con el experimento. En mi caso, elegí C ++, pero el experimento generalmente será aplicable en cualquier lenguaje de programación.

El programa simplemente itera para imprimir una oración en la consola, realizada por una iteración for-loop.


Programa de nueva línea:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

Salida:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

Tenga en cuenta que este resultado no se proporcionará en ningún sistema, está ejecutando este código C ++. Pero funcionará para los sistemas más modernos. Lea abajo para más detalles.


Ahora, el mismo programa, pero con la diferencia, que \nse reemplaza por \ral final de la secuencia de impresión.

Programa de devolución de carro:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

Salida:

7.Walkthrough of the for-loop 

¿Notó dónde está la diferencia? La diferencia es simplemente así, cuando usa la secuencia de escape de retorno de carro\r al final de cada secuencia de impresión, la siguiente iteración de esta secuencia no entra en la siguiente línea de texto: al final de cada secuencia de impresión, el cursor no saltó al principio * de la siguiente línea.

En cambio, el cursor saltó de regreso al comienzo de la línea, en la que se encontraba al final de, antes de usar el \r personaje. - El resultado es que cada siguiente iteración de la secuencia de impresión está reemplazando a la anterior.

* Nota: A \nno necesariamente salta al comienzo de la siguiente línea de texto. En algunos sistemas operativos, en general más antiguos, el resultado del \ncarácter de nueva línea puede ser que salte a cualquier parte de la línea siguiente, no solo al principio. Es por eso que requieren usar \r \npara llegar al comienzo de la siguiente línea de texto.


Este experimento nos mostró la diferencia entre la nueva línea y el retorno de carro en el contexto de la salida de la iteración de una secuencia de impresión.

Cuando se discute sobre la entrada en un programa, algunos terminales / consolas pueden convertir un retorno de carro en una nueva línea implícitamente para una mejor portabilidad, compatibilidad e integridad.

Pero si tiene la opción de elegir uno para otro o desea o necesita usar explícitamente solo uno específico, siempre debe operar con el que se ajuste a su propósito y distinguir estrictamente entre ellos.

RobertS apoya a Monica Cellio
fuente