Recordatorio - \ r \ n o \ n \ r?

390

Simplemente no puedo recordar eso. Entonces, ¿cuál es la forma correcta de terminar correctamente las líneas ASCII anticuadas?

Daniel Mošmondor
fuente
11
Si hace esto, asegúrese de abrir sus archivos en modo binario . De lo contrario, las secuencias de archivos C / C ++ estándar convertirán el "\ n" (para archivos de texto (el valor predeterminado)) en una secuencia de final de línea (ELS) específica de la plataforma. Por lo tanto, "\ r \ n" en Windows se convertirá en "\ r \ r \ n" en el disco físico. Nota: si solo usa C / C ++ para leer el archivo, no notará que el ELS se convertirá nuevamente a "\ n" cuando se lea desde el archivo.
Martin York
@ Martin: estoy en .net y estoy usando (para este ejemplo) File.AppendAllText, con "\ r \ n", y acabo de echar un vistazo a un archivo, y no hay duplicación \ r al final de la línea. ¿Magia?
Daniel Mošmondor
@Daniel: Debería haber sido más específico. Las secuencias C / C ++ . Cuando se asocia con un archivo y se abre en modo texto . También depende de cómo veas el archivo (usa un editor hexadecimal).
Martin York
@ Martin - usó PSPad en modo hexadecimal ...
Daniel Mošmondor
1
En teclados antiguos, la tecla Intro se llamaba tecla de retorno. Entonces, el retorno vino primero, luego se generó el salto de línea en respuesta. Todo es tan obvio cuando tienes demasiada historia.
Mark Ransom

Respuestas:

1084

Usaría la palabra ' r etur n ' para recordar, la r viene antes que la n.

David Snabel-Caunt
fuente
116
Y para recordar que la palabra a usar es retorno , recuerde que \ r es el retorno de carro . ¡No recuerde que "Retorno" es el nombre de la tecla en los teclados de Mac, o de lo contrario podría mirar el teclado de una PC, ver la tecla llamada "Enter" y obtener el orden de letras incorrecto!
Rob Kennedy
3
@David Pero me preguntaba si ese efecto \n\ry \r\nes el mismo, ¿no tienen el mismo efecto? ¿Puede usted decir la diferencia?
Mr.Anubis
77
@ Mr.Anubis si tiene cierta impresora matricial, no debería haber ninguna diferencia, ya que el orden de los comandos no debería ser importante. Sin embargo, en algunas impresoras, obtendrá una línea vacía adicional o ningún avance de línea. Y todo lo dicho anteriormente se aplica a los editores de texto: estarán confundidos, las clases TextStream se enfermarán, etc. El orden es importante. :)
Daniel Mošmondor
12
@ DanielMošmondor Alternativamente, puede recordar que el orden es importante. O que cuando preguntaste en SO alguien te dio un RemiNder, que luego olvidaste. O que no puedes usar tu apellido como recordatorio, porque el orden de r y n está invertido :)
Daniel Daranas
55
@RobKennedy jaja sabes que vine aquí y leí sobre el regreso, y pensé "¡genial!". Entonces leí tu comentario. Ahora, cada vez que no recuerdo qué tecla no debería mirar, miro mi tecla "Enter" y pienso que "algo está muy mal aquí" ... ¡jaja por pensarlo!
Wayne Uroda
53

Si está usando C #, debe usarlo Environment.NewLine, que en consecuencia para MSDN es:

Una cadena que contiene "\ r \ n" para plataformas que no son Unix, o una cadena que contiene "\ n" para plataformas Unix.

BrunoLM
fuente
46
En realidad, este tipo de depende de lo que estás haciendo. Si solo está enviando texto sin formato a la consola o en un archivo para uso local, Environment.NewLineestá bien. Sin embargo, si está escribiendo cosas en un formato bien definido, el formato también puede definir la nueva línea. Por ejemplo, el protocolo HTTP establece que debe usarlo \r\ncomo terminador de línea para encabezados, etc., independientemente de la plataforma.
Matti Virkkunen
3
Sí, este es realmente un mal consejo.
IvanP
Es por eso que necesita escapar de sus mensajes web y construir pruebas unitarias para verificar el envío de \ r \ n (windows), \ r (mac), \ n (linux) se envía correctamente como \ r \ n al servidor web.
TamusJRoyce
37

La nueva línea depende de su sistema operativo:

DOS & Windows: \r\n 0D0A (hex), 13,10 (decimal)
Unix & Mac OS X: \n, 0A, 10
Macintosh (OS 9): \r, 0D, 13

Más detalles aquí: https://ccrma.stanford.edu/~craig/utility/flip/

En caso de duda, use cualquier visor / editor hexadecimal gratuito para ver cómo un archivo codifica su nueva línea.

Para mí, yo uso siguiente guía para ayuda a recordar: 0D0A = \ r \ n = CR, LF = ca rr iage r eturn, li n correo de alimentación

Dom
fuente
77
Por extraño que parezca, soy una de estas personas que se sabe 0D0Ade memoria, pero aún confunde el \ry \n.
Nyerguds
1
O, recuerdo que \ r es el retorno de carro y \ n es el avance de línea ... es solo que no recuerdo su orden, por lo que no ayuda a recordar cuál es 0D y cuál es 0A;)
Nyerguds
20

La secuencia es CR (retorno de carro) - LF (avance de línea). ¿Recuerdas las impresoras matriciales? Exactamente. Entonces, el orden correcto es \ r \ n

Otávio Décio
fuente
Creo que esta es la respuesta más lógica
David Snabel-Caunt
12
LF + CR haría lo mismo CR + LF en impresoras.
ikegami
10
No estoy de acuerdo, @David. Simplemente pensar en impresoras matriciales (o máquinas de escribir, ya que son las que tienen que devolver un carro) no es suficiente. Con solo información básica sobre cómo funcionan, no hay razón para pensar que importa si adelantamos el trabajo antes o después de regresar al inicio de la línea. Tanto \ r \ n como \ n \ r ponen el papel en la misma posición.
Rob Kennedy
@ikegami en la mayoría de las impresoras, no en todas. También tenían interruptores DIP para configurar ese comportamiento. :)
Daniel Mošmondor
55
Una razón para colocar el avance de línea después del retorno del carro es que reduce la cantidad total de tiempo requerido: mientras el cabezal vuelve al borde izquierdo del papel, la platina puede indexar una línea. La operación más larga comienza primero, por lo que toda la operación se completa en el tiempo que lleva ejecutar la operación más larga. Hicimos muchas cosas por razones como esa en ese entonces; imagina esperar un par de cientos de líneas a 110 baudios ...
Jerry Andrews
8

En cualquier idioma .NET, Environment.NewLinesería preferible.

Esteban Araya
fuente
No funciona para cadenas constantes. Cuando sea necesario, es mejor no usar constante y usar una cadena estática en su lugar;)
TamusJRoyce
5

Tenga cuidado al hacer esto manualmente.
De hecho, aconsejaría no hacer esto en absoluto.

En realidad, estamos hablando de la secuencia de terminación de línea LTS que es específica de la plataforma.

Si abre un archivo en modo de texto (es decir, no binario), las secuencias convertirán el "\ n" en el LTS correcto para su plataforma. Luego convierta el LTS nuevamente a "\ n" cuando lea el archivo.

Como resultado, si imprime "\ r \ n" en un archivo de Windows, obtendrá la secuencia "\ r \ r \ n" en el archivo físico (eche un vistazo con un editor hexadecimal).

Por supuesto, esto es un verdadero dolor cuando se trata de transferir archivos entre plataformas.

Ahora, si está escribiendo en una secuencia de red, lo haría manualmente (como la mayoría de los protocolos de red lo llaman específicamente). Pero me aseguraría de que la transmisión no esté interpretando nada (por lo que el modo binario era apropiado).

Martin York
fuente
4

\r\n para Windows funcionará bien.

Puntilla
fuente
Un single también \nfunciona bien en Windows, incluida la última versión de Notepad.
André Caron
Creo que los editores modernos detectarán los finales de línea, ya que diferentes sistemas operativos usan diferentes finales.
David Snabel-Caunt
1
En realidad no: si imprime esto en un archivo (archivo estándar C / C ++ abierto en modo texto) en Windows, el archivo físico contendrá "\ r \ r \ n" (verifíquelo con un editor hexadecimal). Cuando lo lees de nuevo, "\ r \ n" se convierte de nuevo en un solo "\ n".
Martin York
2
En realidad, @DavidCaunt, acabo de intentar \ n y no funciona con el bloc de notas en Win8.
philk
4

De Wikipedia (puede leer cuál es el correcto para su sistema operativo en ese artículo):

Los sistemas basados ​​en ASCII o un conjunto de caracteres compatible usan LF (avance de línea, '\ n', 0x0A, 10 en decimal) o CR (retorno de carro, '\ r', 0x0D, 13 en decimal) individualmente, o CR seguido de LF (CR + LF, '\ r \ n', 0x0D0A).

bhamby
fuente
3

\r\n

Es extraño decir que lo recuerdo porque es lo contrario de la máquina de escribir que utilicé.
Bueno, si era normal no tenía necesidad de recordarlo ...:-)

máquina de escribir de wikipedia * Imagen de Wikipedia

En la máquina de escribir, cuando termina de digitar la línea, utiliza la palanca de retorno del carro , que antes hace rodar el tambor, la nueva línea y luego le permite operar manualmente el retorno del carro .

Puede escuchar de este disco de freesound.org el sonido de la alimentación de papel al principio, y alrededor de -1: 03 segundos desde el final, después de la advertencia de campana para el final del sonido de línea del tambor que rueda y después el del retorno de carro.

Hastur
fuente
2

si está usando C #, ¿por qué no usarlo Environment.NewLine? (Supongo que usa algunos objetos de escritor de archivos ... simplemente páselo Environment.NewLiney manejará los terminadores correctos.

NirMH
fuente