Pregunta

Cómo están \r y \n ¿diferente?Creo que tiene algo que ver con Unix vs.Windows vs.Mac, pero no estoy seguro exactamente en qué se diferencian y cuáles buscar/coincidir en expresiones regulares.

¿Fue útil?

Solución

Son diferentes personajes. \r es retorno de carro, y \n es avance de línea.

En las impresoras "viejos", \r envió el cabezal de impresión de nuevo al comienzo de la línea, y \n avanzó el trabajo de una sola línea. Ambos eran, por tanto, necesaria para iniciar la impresión en la línea siguiente.

Obviamente eso es algo irrelevante ahora, aunque dependiendo de la consola que todavía puede ser capaz de utilizar \r para pasar al principio de la línea y sobrescribir el texto existente.

Más importante aún, Unix tiende a utilizar \n como un separador de línea; Ventanas tiende a utilizar \r\n como separador de línea y Macs (hasta OS 9) utiliza para utilizar \r como separador de línea. (Mac OS X es Unix-y, por lo usa \n lugar;. Que puede haber algunas situaciones de compatibilidad cuando se utiliza en lugar \r sin embargo)

Para obtener más información, consulte la artículo de Wikipedia nueva línea .

EDIT: Este es un lenguaje sensible. 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. Véanse los comentarios para más detalles.

Otros consejos

En C y C ++, \n es un concepto, \r es un personaje, y \r\n es (casi siempre) un error portabilidad.

Piense en un viejo teletipo. El cabezal de impresión se coloca en alguna línea y en algunos columna. Cuando se envía un carácter imprimible para el teletipo, se imprime el carácter en la posición actual y mueve la cabeza a la siguiente columna. (Esto es conceptualmente el mismo que una máquina de escribir, excepto que las máquinas de escribir típicamente se movió el papel con respecto a la cabeza de impresión.)

Cuando se quería terminar la línea actual y comenzar en la línea siguiente, que tenía que hacer dos pasos separados:

  1. mover el cabezal de impresión de nuevo al principio de la línea, a continuación,
  2. mueva hacia abajo a la siguiente línea.

ASCII codifica estas acciones como dos caracteres de control diferentes:

  • \x0D (CR) se mueve el cabezal de impresión de nuevo al principio de la línea. (Unicode codifica esto como U+000D CARRIAGE RETURN.)
  • \x0A (LF) mueve la cabeza de impresión hacia abajo a la siguiente línea. (Unicode codifica esto como U+000A LINE FEED.)

En los días de teletipos y las impresoras de tecnología principios, la gente realmente se aprovecharon del hecho de que se trataba de dos operaciones separadas. Mediante el envío de un CR sin siguiéndolo por un LF, podría imprimir a través de la línea que ya impreso. Esta efectos como acentos, negrita y subrayado permitido. Algunos sistemas sobreimpresas varias veces para evitar que las contraseñas sean visibles en papel. En los terminales de serie CRT primeros, CR fue una de las maneras de controlar la posición del cursor con el fin de actualizar el texto que ya están en la pantalla.

Pero la mayoría de las veces, en realidad sólo quería ir a la siguiente línea. En lugar de requerir el par de caracteres de control, algunos sistemas permitió sólo una o la otra. Por ejemplo:

  • variantes de Unix (incluyendo las versiones modernas de Mac) utiliza sólo un carácter LF para indicar una nueva línea.
  • Los archivos antiguos (pre-OSX) Macintosh utilizan sólo un carácter CR para indicar una nueva línea.
  • VMS, CP / M, DOS, Windows, y muchos protocolos de red Todavía esperar tanto: CR LF
  • .
  • Los sistemas IBM viejos que utiliza EBCDIC estandarizado en NL - un personaje que ni siquiera existe en el carácter ASCII conjunto. En Unicode, NL es U+0085 NEXT LINE, pero el valor real es EBCDIC 0x15.

¿Por qué elegir diferentes sistemas diferentes métodos? Simplemente porque no existía una norma universal. Cuando el teclado, probablemente dice "Enter", teclados antiguos solían decir "Return", que era la abreviatura de retorno de carro. De hecho, en un terminal serie, pulsando Retorno realmente envía el carácter CR. Si estuviera escribiendo un editor de texto, sería tentador simplemente usar ese personaje, ya que apareció por la terminal. Tal vez por eso los Macs más antiguos utilizan simplemente CR.

Ahora que tenemos normas , hay más formas de representar los saltos de línea. Aunque es extremadamente raro en la naturaleza, Unicode tiene nuevos personajes como:

  • U+2028 LINE SEPARATOR
  • U+2029 PARAGRAPH SEPARATOR

Incluso antes de Unicode llegó, los programadores querían formas sencillas para representar algunos de los códigos de control más útiles sin preocuparse por el juego de caracteres subyacente. C tiene varias secuencias de escape para la representación de los códigos de control:

  • \a (para la alerta), que toca la campana teletipo o hace que el pitido de terminal
  • \f (para la alimentación de forma), que se mueve al comienzo de la página siguiente
  • \t (por ficha) que se mueve el cabezal de impresión a la siguiente posición pestaña horizontal

(Esta lista es intencionalmente incompleta.)

Este mapeo sucede en en tiempo de compilación -. El compilador ve \a y pone cualquier valor que la magia se utiliza para tocar la campana

Aviso that la mayoría de estos mnemotécnicos tienen correlaciones directas a los códigos de control ASCII. Por ejemplo, podría asignar a \a 0x07 BEL. Un compilador podría ser escrito para un sistema que utiliza algo distinto de ASCII para el conjunto de caracteres de host (por ejemplo, EBCDIC). La mayoría de los códigos de control que tenían mnemónicos específicos podría ser asignada para controlar los códigos de otros conjuntos de caracteres.

Hurra! Portabilidad!

Bueno, casi. En C, podría escribir printf("\aHello, World!"); que suena la campana (o emite un pitido) y emite un mensaje. Pero si quería continuación, imprimir algo en la línea siguiente, todavía había necesidad de saber lo que la plataforma de acogida exige a pasar a la siguiente línea de salida. CR LF? CR? LF? NL? ¿Algo más? Esto en cuanto a la portabilidad.

C tiene dos modos de I / O: binarios y de texto. En el modo binario, todos los datos que se envía se transmite tal cual. Pero en modo texto, hay un en tiempo de ejecución traducción que convierte un carácter especial a lo que necesita la plataforma anfitrión de una nueva línea (y viceversa).

Gran, así que cuál es el carácter especial?

Bueno, eso es dependiente de la implementación, también, pero hay una manera independiente de la implementación para especificar que: \n. Por lo general se llama el "carácter de nueva línea".

Este es un punto sutil pero importante: \n se asigna a los cuales (el modo de texto en tiempo de compilación para un valor definido por la implementación carácter ) a continuación, se asigna de nuevo en tiempo de ejecución para el carácter real (o secuencia de caracteres) requerida por la plataforma subyacente para pasar a la siguiente línea.

\n es diferente a todos los demás literales de barra invertida, porque hay dos asignaciones implicadas. Este mapeo de dos etapas hace \n significativamente diferente de incluso \r, que es simplemente una asignación de tiempo de compilación para CR (o el código de control más similar en cualquiera que sea el conjunto de caracteres de fondo es).

Esto hace tropezar a muchos programadores de C y C ++. Si se va a encuestar a 100 de ellos, al menos 99 le dirá que \n significa salto de línea. Esto no es enteramente verdad. La mayoría (quizás todos) C y C ++ utilizan implementaciones LF como el valor intermedio mágica para \n, pero eso es un detalle de implementación. Es factible que un compilador que utilice un valor diferente. De hecho, si el conjunto de caracteres de acogida no es un superconjunto de ASCII (por ejemplo, si se trata de EBCDIC), entonces \n es casi seguro que no sea LF.

Por lo tanto, en C y C ++:

  • \r es literalmente un retorno de carro.
  • \n es un valor mágico que se traduce (en modo texto) a en tiempo de ejecución a / de la semántica de nueva línea de la plataforma de acogida.
  • \r\n es casi siempre un error portabilidad. En el modo de texto, esto se traduce a CR seguido de secuencia de nueva línea de la plataforma - probablemente no lo que está previsto. En modo binario, esto se traduce a CR seguido de algún valor mágico que podría no sea LF - posiblemente no es lo que pretende
  • .
  • \x0A es la forma más portátil para indicar un LF ASCII, pero sólo se quiere hacer eso en modo binario. La mayoría de las implementaciones en modo texto que tratarán como \n.
  • " " => Volver
  • " n" => newline o linefeed (semántica)

  • Los sistemas basados ​​en Unix utilizan sólo " " para finalizar una línea de texto.

  • Dos usa " " para finalizar una línea de texto.
  • Algunas otras máquinas usaban solo " ".(Commodore, Apple II, Mac OS anterior a OS X, etc.)

En resumen \ r tiene un valor ASCII 13 (CR) y \ n tiene un valor ASCII 10 (LF). Mac utiliza como delimitador de línea CR (al menos, lo hacía antes, no estoy seguro de Macs modernos), * nix utiliza LF y Windows utiliza tanto (CRLF).

\r se utiliza para señalar el comienzo de una línea y puede sustituir el texto a partir de ahí, por ejemplo.

main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}

Produce esta salida:

hai

\n es para la nueva línea.

Además de la respuesta de @ Jon Skeet:

Tradicionalmente Windows ha utilizado \ r \ n, Mac \ r Unix \ yn, sin embargo nuevos Macs usan \ n, ya que está basado en Unix.

en C # He encontrado que utilizan \ r \ n en una cadena.

\ r es el retorno de carro; \ N es la nueva línea (Line Feed) ... depende del sistema operativo en cuanto a qué significa cada uno. Lea este artículo para más información sobre la diferencia entre '\ n' '\ r \ n' ... en C.

\ r utilizado para retorno de carro. (Valor ASCII es 13) \ N utilizado para la nueva línea. (Valor ASCII es 10)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top