¿Cómo son \r
y \n
diferentes? Creo que tiene algo que ver con Unix vs. Windows vs. Mac, pero no estoy seguro de cómo son exactamente diferentes, y cuál buscar / emparejar en expresiones regulares.
special-characters
line-endings
Sam Lee
fuente
fuente
'\n'
.Respuestas:
Son personajes diferentes.
\r
es el retorno de carro y\n
es el avance de línea.En impresoras "viejas",
\r
envió el cabezal de impresión de regreso al inicio de la línea y\n
avanzó el papel una línea. Por lo tanto, ambos fueron necesarios para comenzar a imprimir en la siguiente línea.Obviamente, eso es algo irrelevante ahora, aunque dependiendo de la consola aún puede usar
\r
para moverse al inicio de la línea y sobrescribir el texto existente.Más importante aún, Unix tiende a usarse
\n
como un separador de línea; Windows tiende a usarse\r\n
como separador de línea y Macs (hasta OS 9) solía usarse\r
como separador de línea. (Mac OS X es Unix-y, por lo tanto, usa en su\n
lugar; sin embargo, puede haber algunas situaciones de compatibilidad en las que\r
se usa).Para obtener más información, consulte el artículo de la nueva línea de Wikipedia .
EDITAR: Esto es sensible al lenguaje. En C # y Java, por ejemplo,
\n
siempre significa Unicode U + 000A, que se define como avance de línea. En C y C ++, el agua es algo más turbia, ya que el significado es específico de la plataforma. Ver comentarios para más detalles.fuente
\n
se garantiza que sea nueva línea (sección 2.4.4.4). Por supuesto, sería bueno si el OP hubiera especificado la plataforma ... Además, creo que este nivel de detalle sería más confuso que útil para alguien que solo pregunta la diferencia.En C y C ++,
\n
es un concepto,\r
es un personaje y\r\n
es (casi siempre) un error de portabilidad.Piensa en un viejo teletipo. El cabezal de impresión se coloca en una línea y en una columna. Cuando envía un carácter imprimible al teletipo, imprime el carácter en la posición actual y mueve la cabeza a la siguiente columna. (Esto es conceptualmente lo mismo que una máquina de escribir, excepto que las máquinas de escribir generalmente mueven el papel con respecto al cabezal de impresión).
Cuando quería terminar la línea actual y comenzar en la siguiente línea, tenía que hacer dos pasos separados:
ASCII codifica estas acciones como dos caracteres de control distintos:
\x0D
(CR) mueve el cabezal de impresión de regreso al comienzo de la línea. (Unicode codifica esto comoU+000D CARRIAGE RETURN
.)\x0A
(LF) mueve el cabezal de impresión hacia abajo a la siguiente línea. (Unicode codifica esto comoU+000A LINE FEED
.)En los días de los teletipos y las primeras impresoras tecnológicas, las personas realmente aprovecharon el hecho de que se trataba de dos operaciones separadas. Al enviar un CR sin seguirlo por un LF, puede imprimir sobre la línea que ya imprimió. Esto permitió efectos como acentos, negrita y subrayado. Algunos sistemas se sobreimprimen varias veces para evitar que las contraseñas sean visibles en la copia impresa. En los primeros terminales seriales de CRT, CR era una de las formas de controlar la posición del cursor para actualizar el texto que ya estaba en la pantalla.
Pero la mayoría de las veces, en realidad solo quería pasar a la siguiente línea. En lugar de requerir el par de caracteres de control, algunos sistemas permitieron solo uno u otro. Por ejemplo:
U+0085 NEXT LINE
, pero el valor real EBCDIC es0x15
.¿Por qué diferentes sistemas eligieron diferentes métodos? Simplemente porque no había un estándar universal. Cuando su teclado probablemente dice "Enter", los teclados más antiguos solían decir "Return", que era la abreviatura de Carriage Return. De hecho, en un terminal en serie, al presionar Retorno en realidad se envía el carácter CR. Si estuviera escribiendo un editor de texto, sería tentador usar ese carácter tal como vino desde el terminal. Quizás es por eso que los Macs más antiguos usaban solo CR.
Ahora que tenemos estándares , hay más formas de representar saltos de línea. Aunque extremadamente raro en la naturaleza, Unicode tiene nuevos personajes como:
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
Incluso antes de que apareciera Unicode, los programadores querían formas simples de representar algunos de los códigos de control más útiles sin preocuparse por el conjunto de caracteres subyacente. C tiene varias secuencias de escape para representar códigos de control:
\a
(para alerta) que suena el timbre del teletipo o hace sonar el terminal\f
(para el formulario de alimentación) que se mueve al comienzo de la página siguiente\t
(para pestaña) que mueve el cabezal de impresión a la siguiente posición de pestaña horizontal(Esta lista está intencionalmente incompleta).
Este mapeo ocurre en tiempo de compilación: el compilador ve
\a
y pone cualquier valor mágico que se use para tocar el timbre.Tenga en cuenta que la mayoría de estos mnemónicos tienen correlaciones directas con los códigos de control ASCII. Por ejemplo,
\a
se asignaría a0x07 BEL
. Se podría escribir un compilador para un sistema que utilizara algo distinto de ASCII para el conjunto de caracteres del host (por ejemplo, EBCDIC). La mayoría de los códigos de control que tenían mnemónicos específicos podrían asignarse a códigos de control en otros conjuntos de caracteres.Huzzah! ¡Portabilidad!
Bueno, casi. En C, podría escribir
printf("\aHello, World!");
qué suena la campana (o suena) y emite un mensaje. Pero si quisiera imprimir algo en la siguiente línea, aún necesitaría saber qué requiere la plataforma host para pasar a la siguiente línea de salida. CR LF? CR? LF? NL? ¿Algo más? Demasiado para la portabilidad.C tiene dos modos para E / S: binario y texto. En modo binario, los datos que se envían se transmiten tal cual. Pero en modo texto, hay una traducción en tiempo de ejecución que convierte un carácter especial a lo que la plataforma de host necesita para una nueva línea (y viceversa).
Genial, ¿cuál es el personaje especial?
Bueno, eso depende de la aplicación, también, pero hay una manera independiente de la implementación para especificar que:
\n
. Normalmente se llama el "personaje de nueva línea".Este es un punto sutil pero importante:
\n
se asigna en tiempo de compilación a un valor de carácter definido por la implementación que (en modo texto) se vuelve a asignar en tiempo de ejecución al carácter real (o secuencia de caracteres) requerido por la plataforma subyacente para moverse a la siguiente línea\n
es diferente de todos los demás literales de barra diagonal inversa porque hay dos asignaciones involucradas. Este mapeo de dos pasos hace\n
significativamente diferente que incluso\r
, que es simplemente un mapeo en tiempo de compilación a CR (o el código de control más similar en cualquier conjunto de caracteres subyacente).Esto dispara muchos programadores C y C ++. Si tuviera que sondear 100 de ellos, al menos 99 le indicarán que eso
\n
significa avance de línea. Esto no es enteramente verdad. La mayoría (quizás todas) las implementaciones de C y C ++ usan LF como el valor intermedio mágico para\n
, pero ese es un detalle de implementación. Es factible que un compilador use un valor diferente. De hecho, si el conjunto de caracteres del host no es un superconjunto de ASCII (p. Ej., Si es EBCDIC),\n
es casi seguro que no será LF.Entonces, en C y C ++:
\r
es literalmente un retorno de carro.\n
es un valor mágico que se traduce (en modo de texto) en tiempo de ejecución a / desde la semántica de nueva línea de la plataforma host.\r\n
Casi siempre es un error de portabilidad. En modo de texto, esto se traduce a CR seguido de la secuencia de nueva línea de la plataforma, probablemente no lo que se pretende. En modo binario, esto se traduce a CR seguido de algún valor mágico que podría no ser LF, posiblemente no lo que se pretende.\x0A
es la forma más portátil de indicar un ASCII LF, pero solo desea hacerlo en modo binario. La mayoría de las implementaciones en modo texto tratarán eso como\n
.fuente
\r\n
realidad es la única forma en que podría dividir correctamente las líneas en elementos de lista separados. Me hace preguntarme si esto es un artefacto HTML extraño, o si tiene que ver con la forma en que Python ingiere la cadena de mirequest
objeto."\ n" => Newline o Linefeed (semántica)
Los sistemas basados en Unix usan solo un "\ n" para finalizar una línea de texto.
fuente
\r
se usa para señalar el inicio de una línea y puede reemplazar el texto desde allí, p. ej.Produce esta salida:
\n
Es para nueva línea.fuente
En resumen, \ r tiene un valor ASCII 13 (CR) y \ n tiene un valor ASCII 10 (LF). Mac usa CR como delimitador de línea (al menos, lo hizo antes, no estoy seguro para los Mac modernos), * nix usa LF y Windows usa ambos (CRLF).
fuente
Además de la respuesta de @Jon Skeet:
Tradicionalmente, Windows ha usado \ r \ n, Unix \ ny Mac \ r, sin embargo, las Mac más nuevas usan \ n ya que están basadas en Unix.
fuente
en C # descubrí que usan \ r \ n en una cadena.
fuente
\ r es el retorno del carro; \ n es Nueva línea (avance de línea) ... depende del sistema operativo en cuanto a lo que cada uno significa. Lea este artículo para obtener más información sobre la diferencia entre '\ n' y '\ r \ n' ... en C.
fuente
\ r utilizado para el retorno de carro. (El valor ASCII es 13) \ n usado para una nueva línea. (El valor ASCII es 10)
fuente