¿Cómo se manejan \ ny \ r de manera diferente en Linux y Windows?

22

Creo que \nmueve la aguja hacia abajo y \rmueve la aguja al comienzo de una línea (alinear a la izquierda). Sin embargo, no estoy seguro. Entonces, si me equivoco, corrígeme ...

De todos modos, me dijeron que Windows y Linux manejan newlinesy de manera carriage returnsdiferente. Me gustaría saber cómo los manejan de manera diferente y algunos lugares donde es importante recordar. Gracias por responder.

千里 ち ゃ ん
fuente
Hasta ahora sé que \r\nestá bien en Windows pero \n\rno lo está, y lo recuerdo porque \r\nes un acrónimo de enfermera registrada. También escuché que eso \nes lo que la gente usa en Linux y \rno se usa solo para el mismo propósito que \r\n. \rse usa en MacOS realmente antiguos. Sin embargo, no he verificado estos hechos.
千里 ち ゃ ん
44
No los llame \ry \n, dado que \nsu manejo depende de dónde lo esté usando. Mejor llamarlos CRy LF.
Ignacio Vazquez-Abrams
Ignacio, esas siglas no tienen sentido para mí. Cómo le llamas a esto :/? OH ... ALIMENTACIÓN DE LÍNEA y DEVOLUCIÓN DEL TRANSPORTE. Gracias sleske.
千里 ち ゃ ん
@ IgnacioVazquez-Abrams ¿\ n no es idéntico a LF? En cualquier gráfico ASCII, ¿no es el carácter 13 = \ n = LF?
barlop
1
@barlop: No está en C cuando sale en Windows.
Ignacio Vazquez-Abrams

Respuestas:

21

Creo que \ n mueve la aguja hacia abajo, y \ r mueve la aguja al comienzo de una línea (alinear a la izquierda). Aunque no estoy seguro

Esto es cierto, más o menos, pero sobre todo una curiosidad histórica. Originalmente, el avance de línea (LF) se usaba para avanzar el papel por una línea en impresoras y terminales de copia impresa ( teleimpresoras ); El retorno de carro (CR) devolvió el cabezal de impresión al inicio de la línea.

Esto probablemente todavía funciona en impresoras modernas cuando se usa en "modo de texto", pero hoy en día es de poca relevancia.

De todos modos, me dijeron que Windows y Linux manejan las nuevas líneas y los retornos de carro de manera diferente.

La diferencia es simple: los diseñadores de sistemas operativos tuvieron que elegir cómo representar el inicio de una nueva línea de texto en los archivos de la computadora. Por varias razones históricas, en el mundo Unix / Linux se eligió un único carácter LF como marcador de nueva línea; MS-DOS eligió CR + LF, y Windows heredó esto. Por lo tanto, diferentes plataformas utilizan diferentes convenciones.

En la práctica, esto se está convirtiendo en un problema cada vez menor. El marcador de nueva línea en realidad solo es relevante para los pogramas que procesan "texto sin formato", y no hay tantos, principalmente afecta el código fuente del programa, los archivos de configuración y algunos archivos de texto simples con documentación. Hoy en día, la mayoría de los programas que manejan este tipo de archivos (editores, compiladores, etc.) pueden manejar ambas convenciones de nueva línea, por lo que no importa cuál elija.

Hay algunos casos en los que las herramientas insisten en "su" convención de nueva línea (por ejemplo, los scripts de shell de Unix no deben usar CR + LF), en cuyo caso debe usar el correcto.

sleske
fuente
Misma línea de preguntas: ¿los lenguajes de programación reconocen \n\ry \nson lo mismo? Por ejemplo, si estaba analizando un archivo de texto que fue editado en la PC de otra persona y contenía las versiones de salto de línea de Linux y Windows, ¿realizaría un preg_matchfor \ny \n\rme daría resultados diferentes?
千里 ち ゃ ん
@ 千里 ち ゃ ん: Esto depende totalmente del lenguaje de programación, del compilador, etc. En particular, si usa expresiones regulares, dependerá del motor de expresiones regulares que use; algunas distinguen diferentes terminaciones de línea, otras no (la mayoría se puede configurar de cualquier manera, Yo creo).
sleske
@ 千里 ち ゃ ん: Si tiene una pregunta sobre cómo un sistema / lenguaje de programación / motor de expresión regular maneja diferentes convenciones de nueva línea, simplemente haga esto como una pregunta separada.
sleske
deberías escribir \ r \ n no al revés que tú. En cuanto a los lenguajes de programación, podrían leer caracteres individuales y usted, el programador, puede ver cuál se utiliza en la entrada, y también puede hacer lo que desee para la salida. Del mismo modo que podrías decir "Escribe ABC seguido de \ r \ r \ r \ n" ¡los caracteres que quieras pegar al final! algunos otros caracteres pueden no ser imprimibles y no gráficos o lo que sea. Pueden tener algunas funciones integradas como println, y lo que usan para su nueva línea sería una u otra, no pueden ser ambas.
barlop
@ 千里 ち ゃ ん y algunos lenguajes de programación pueden permitirle elegir qué lnie termina como ajuste en una de sus funciones integradas, por lo que incluso en una función incorporada podría ... en teoría, de todos modos. + como se mencionó, en la práctica puede escribir cualquier final de línea que desee ... aunque es posible que no pueda hacerlo de manera eficiente como con una función println.
barlop
14

CR y LF

El Código Estándar Americano para el Intercambio de Información (ASCII) definió caracteres de control que incluyen CARRIAGE-RETURN (CR) y LINE-FEED (LF) que fueron (y aún son) utilizados para controlar la posición de impresión en impresoras de una manera análoga a máquinas de escribir mecánicas que precedieron a las primeras impresoras informáticas.

Dependencia de la plataforma

En Windows, el separador de línea tradicional en los archivos de texto es CR seguido de LF

En los sistemas Apple Macintosh antiguos (anteriores a OSX), el separador de línea tradicional en los archivos de texto era CR

En Unix y Linux, el separador de línea tradicional en los archivos de texto es LF.

\ n y \ r

En muchos lenguajes de programación y scripting \nsignifica "nueva línea". A veces (pero no siempre) esto significa el carácter ASCII LINE-FEED (LF), que, como usted dice, mueve el cursor (o la posición de impresión) una línea hacia abajo. En una impresora o máquina de escribir, esto realmente movería el papel una línea hacia arriba.

Invariablemente \rsignifica el carácter ASCII CARRIAGE-RETURN (CR) cuyo nombre en realidad proviene de máquinas de escribir mecánicas donde había una tecla de retorno de carro que hacía que el rodillo ("carro") que llevaba el papel se moviera hacia la derecha, accionado por un resorte, tan lejos como fuera posible. Por lo tanto, establecer la posición de escritura actual en el margen izquierdo.

Programación

En algunos lenguajes de programación \npuede significar una secuencia de caracteres dependiente de la plataforma que termina o separa líneas en un archivo de texto. Por ejemplo, en Perl, print "\n"produce una secuencia de caracteres diferente en Linux que en Windows.

En Java, la mejor práctica, si desea utilizar las terminaciones de línea nativas para la plataforma de tiempo de ejecución, es no utilizarlas \no no utilizarlas \r. Debe utilizar System.getProperty("line.separator"). Debe usar \ny \rdonde desee LF y CR independientemente de la plataforma (por ejemplo, como se usa en HTTP, FTP y otros protocolos de comunicaciones de Internet).

Unix stty

En un shell de Unix, el sttycomando puede usarse para hacer que el shell se traduzca entre estas diversas convenciones. Por ejemplo stty -onlcr, el shell traducirá posteriormente todos los LF salientes a CR LF.

Linux y OSX siguen las convenciones de Unix

Archivos de texto

Los archivos de texto siguen siendo enormemente importantes y ampliamente utilizados. Por ejemplo, HTML y XML son ejemplos de archivos de texto. La mayoría de los protocolos importantes de Internet, como HTTP, siguen convenciones de archivos de texto e incluyen especificaciones para finales de línea.

Impresoras

La mayoría de las impresoras que no sean las más baratas, aún respetan CR y LF. De hecho, son fundamentales para los lenguajes de descripción de páginas más utilizados: PCL y Postscript.

RedGrittyBrick
fuente
1
Nota sobre Java: generalmente no es cierto que "no se debe usar \ n o \ r en absoluto". Es solo que en Java, "\ n" siempre es LF y "\ r" siempre es CR. Esto puede ser justo lo que desea: si desea un estilo de final de línea específico, úselos; si quieres explícitamente la línea materna de finalización del ordenador que está ejecutando en, a continuación, utilizar line.separator. Realmente depende de lo que quiera.
sleske
Y, por cierto, println()se usa automáticamente line.separator, por lo que si desea terminaciones de línea nativas, puede usar println()(y si necesita un cierto tipo específico de terminación de línea, entonces no lo use, pero use "\ n" etc. explícitamente).
sleske
@sleske: buenos puntos. Actualizaré mi respuesta en consecuencia.
RedGrittyBrick
1
¿Hay algún lenguaje o compilador donde \nhaya un carácter de control que no sea ASCII LF (que no sea un sistema basado en EBCDIC)? Me refiero a lo que \nsignifica en una cadena o literal de caracteres, no al efecto de enviarlo a un archivo o dispositivo de salida.
Keith Thompson el
1
@KeithThompson: Para Java: Sí, \nsiempre es el código 10 ASCII (y Unicode), porque el JLS lo dice explícitamente (JLS 3.10.6, "Secuencias de escape para literales de caracteres y cadenas" - Marqué :-)). Para otros idiomas, buena pregunta.
sleske
4

En resumen, era necesario para las impresoras, pero ahora los sistemas operativos lo hacen de manera ligeramente diferente. En la mayoría de los casos, está bien simplemente hacer CR y LF haciendo \r\ny en la mayoría de los casos, esto funcionará bien.

James Billingham
fuente
¿Linux simplemente ignora \ro causa algún tipo de cambio de comportamiento?
Aaron Franke