Una nueva línea (frecuentemente llamada final de línea , fin de línea ( EOL ), siguiente línea ( NEL ) o salto de línea ) es un carácter de control o una secuencia de caracteres de control en especificaciones de codificación de caracteres como ASCII , EBCDIC , Unicode , etc. o una secuencia de caracteres, se utiliza para indicar el final de una línea de texto y el comienzo de una nueva. [1]
A mediados del siglo XIX, mucho antes de la llegada de los teleimpresores y los teletipos, los operadores o telegrafistas del código Morse inventaron y utilizaron prosignos del código Morse para codificar el formato de texto de espacios en blanco en mensajes de texto escritos formales. En particular, el prosigno Morse BT (texto de ruptura mnemotécnico ) representado por la concatenación de códigos Morse textuales literales, caracteres "B" y "T" enviados sin el espacio normal entre caracteres, se utiliza en código Morse para codificar e indicar una nueva línea. o nueva sección en un mensaje de texto formal.
Más tarde, en la era de los teletipos modernos , se desarrollaron códigos de control de juegos de caracteres estandarizados para ayudar en el formato del texto en espacios en blanco. ASCII fue desarrollado simultáneamente por la Organización Internacional de Normalización (ISO) y la Asociación Estadounidense de Estándares (ASA), siendo esta última la organización predecesora del Instituto Nacional Estadounidense de Estándares (ANSI). Durante el período de 1963 a 1968, los borradores de estándares ISO respaldaban el uso de .mw-parser-output .monospaced{font-family:monospace,monospace}CR+LF o LF solo como nueva línea, mientras que los borradores de ASA solo admitían CR + LF .
La secuencia CR + LF se usaba comúnmente en muchos de los primeros sistemas informáticos que habían adoptado máquinas Teletipo , generalmente un Teletipo Modelo 33 ASR, como dispositivo de consola, porque esta secuencia era necesaria para colocar esas impresoras al comienzo de una nueva línea. La separación de la nueva línea en dos funciones ocultaba el hecho de que el cabezal de impresión no podía regresar desde el extremo derecho al comienzo de la siguiente línea a tiempo para imprimir el siguiente carácter. Cualquier carácter impreso después de un CR a menudo se imprimía como una mancha en el medio de la página mientras el cabezal de impresión todavía movía el carro de regreso a la primera posición. "La solución fue hacer que la nueva línea tuviera dos caracteres: CR para mover el carro a la columna uno y LF para mover el papel hacia arriba". [2] De hecho, a menudo era necesario enviar caracteres de relleno adicionales (CR o NUL extraños) que se ignoran pero le dan tiempo al cabezal de impresión para moverse hacia el margen izquierdo. Muchas de las primeras pantallas de vídeo también requerían varios caracteres para desplazarse por la pantalla.
En tales sistemas, las aplicaciones tenían que comunicarse directamente con la máquina Teletype y seguir sus convenciones, ya que el concepto de controladores de dispositivos que ocultaban dichos detalles de hardware a la aplicación aún no estaba bien desarrollado. Por lo tanto, el texto se compuso de forma rutinaria para satisfacer las necesidades de las máquinas de teletipo. La mayoría de los sistemas de minicomputadoras de DEC utilizaron esta convención. CP/M también lo utilizó para imprimir en los mismos terminales que utilizaban las minicomputadoras. A partir de ahí, MS-DOS (1981) adoptó CR + LF de CP/M para ser compatible, y esta convención fue heredada por el posterior sistema operativo Windows de Microsoft.
El sistema operativo Multics comenzó a desarrollarse en 1964 y utilizó únicamente LF como nueva línea. Multics usó un controlador de dispositivo para traducir este carácter a cualquier secuencia que necesitara una impresora (incluidos caracteres de relleno adicionales ), y el byte único era más conveniente para la programación. Lo que parece una opción más obvia, CR , no se utilizó, ya que CR proporcionaba la útil función de sobreimprimir una línea con otra para crear efectos de negrita , subrayado y tachado . Quizás lo más importante es que el uso de LF solo como terminador de línea ya se había incorporado en los borradores de la eventual norma ISO/IEC 646 . Unix siguió la práctica de Multics y, más tarde, los sistemas similares a Unix siguieron a Unix. Esto creó conflictos entre Windows y los sistemas operativos tipo Unix , donde los archivos compuestos en un sistema operativo no podían ser formateados o interpretados adecuadamente por otro sistema operativo (por ejemplo, un script de shell UNIX escrito en un editor de texto de Windows como el Bloc de notas [3] [4 ] ).
Los conceptos de retorno de carro (CR) y avance de línea (LF) están estrechamente relacionados y pueden considerarse por separado o juntos. En los medios físicos de máquinas de escribir e impresoras , se necesitan dos ejes de movimiento, "hacia abajo" y "a lo ancho", para crear una nueva línea en la página . Aunque el diseño de una máquina (máquina de escribir o impresora) debe considerarlos por separado, la lógica abstracta del software puede combinarlos como un solo evento. Esta es la razón por la que una nueva línea en la codificación de caracteres se puede definir CR
y LF
combinar en una (comúnmente llamada CR+LF
o CRLF
).
Algunos juegos de caracteres proporcionan un código de carácter de nueva línea independiente. EBCDIC , por ejemplo, proporciona un código de carácter NL además de los códigos CR y LF . Unicode , además de proporcionar los códigos de control ASCII CR y LF , también proporciona un código de control de "siguiente línea" ( NEL ), así como códigos de control para los marcadores "separador de línea" y "separador de párrafo".
0x85
#
Muchos protocolos de comunicaciones tienen algún tipo de convención de nueva línea. En particular, los protocolos publicados por Internet Engineering Task Force (IETF) suelen utilizar la secuencia ASCII CRLF.
En algunos protocolos más antiguos, la nueva línea puede ir seguida de una suma de comprobación o un carácter de paridad.
El estándar Unicode define una serie de caracteres que las aplicaciones conformes deben reconocer como terminadores de línea: [9]
Si bien puede parecer demasiado complicado en comparación con un enfoque como convertir todos los terminadores de línea a un solo carácter (por ejemplo, LF ), Unicode está diseñado para preservar toda la información al convertir un archivo de texto de cualquier codificación existente a Unicode y viceversa ( ida y vuelta) . integridad ), Unicode necesita hacer las mismas distinciones entre saltos de línea realizadas por otras codificaciones.
Por ejemplo: NL es parte de EBCDIC , que usa el código 0x15 ; normalmente se asigna a Unicode NEL , 0x85 , que es un carácter de control en el conjunto de control C1 . [10] Como tal, está definido por ECMA 48, [11] y reconocido mediante codificaciones que cumplen con ISO/IEC 2022 (que es equivalente a ECMA 35). [12] El conjunto de control C1 también es compatible con ISO-8859-1 . [ cita necesaria ] El enfoque adoptado en el estándar Unicode permite que la transformación de ida y vuelta preserve la información y al mismo tiempo permita que las aplicaciones reconozcan todos los tipos posibles de terminadores de línea.
No es frecuente reconocer y utilizar códigos de nueva línea mayores que 0x7F ( NEL , LS y PS ). Son varios bytes en UTF-8 y el código para NEL se ha utilizado como carácter de puntos suspensivos ( ) en Windows-1252 . Por ejemplo:…
Los caracteres especiales Unicode U+2424 ( SÍMBOLO DE NUEVA LÍNEA , ), U+23CE ( SÍMBOLO DE RETORNO , ), U+240D ( SÍMBOLO DE RETORNO DE CARRIAJE , ) y U+240A ( SÍMBOLO DE SALTO DE LÍNEA , ) son glifos destinados a presentar una carácter visible para el usuario para el lector del documento y, por lo tanto, no se reconocen como una nueva línea.
⏎
␍
␊
Para facilitar la creación de programas portátiles , los lenguajes de programación proporcionan algunas abstracciones para lidiar con los diferentes tipos de secuencias de nueva línea utilizadas en diferentes entornos.
El lenguaje de programación C proporciona las secuencias de escape '\n' (nueva línea) y '\r' (retorno de carro). Sin embargo, no es necesario que sean equivalentes a los caracteres de control ASCII LF y CR . El estándar C sólo garantiza dos cosas:
En las plataformas Unix, donde se originó C, la secuencia de nueva línea nativa es ASCII LF ( 0x0A ), por lo que '\n' simplemente se definió como ese valor. Dado que la representación interna y externa son idénticas, la traducción realizada en modo texto no es operativa y Unix no tiene noción de modo texto o modo binario. Esto ha provocado que muchos programadores que desarrollaron su software en sistemas Unix simplemente ignoraran la distinción por completo, lo que resultó en un código que no es portátil a diferentes plataformas.
Es mejor evitar la función de la biblioteca C fgets () en modo binario porque cualquier archivo que no esté escrito con la convención de nueva línea de Unix se leerá mal. Además, en modo texto, cualquier archivo que no esté escrito con la secuencia de nueva línea nativa del sistema (como un archivo creado en un sistema Unix y luego copiado a un sistema Windows) también se leerá mal.
Otro problema común es el uso de '\n' cuando se comunica mediante un protocolo de Internet que exige el uso de ASCII CR + LF para finalizar líneas. Escribir '\n' en una secuencia en modo texto funciona correctamente en sistemas Windows, pero solo produce LF en Unix y algo completamente diferente en sistemas más exóticos. Usar "\r\n" en modo binario es un poco mejor.
Muchos lenguajes, como C++ , Perl , [20] y Haskell proporcionan la misma interpretación de '\n' que C. C++ tiene un modelo de E/S alternativo donde el manipulador std::endl se puede usar para generar una nueva línea (y vacía el búfer de flujo).
Java , PHP , [21] y Python [22] proporcionan la secuencia '\r\n' (para ASCII CR + LF ). A diferencia de C, se garantiza que estos representan los valores U+000D y U+000A , respectivamente.
Las bibliotecas de E/S de Java no las traducen de forma transparente en secuencias de nueva línea dependientes de la plataforma en la entrada o salida. En su lugar, proporcionan funciones para escribir una línea completa que agrega automáticamente la secuencia de nueva línea nativa y funciones para leer líneas que aceptan cualquiera de CR , LF o CR + LF como terminador de línea (consulte BufferedReader.readLine()). El método System.lineSeparator() se puede utilizar para recuperar el separador de línea subyacente.
Ejemplo:
Cadena eol = Sistema . Separador de línea (); String lineColor = "Color: Rojo" + eol ;
Python permite el "Soporte universal de nueva línea" al abrir un archivo para leerlo, al importar módulos y al ejecutar un archivo. [23]
Algunos lenguajes han creado variables , constantes y subrutinas especiales para facilitar las nuevas líneas durante la ejecución del programa. En algunos lenguajes como PHP y Perl , se requieren comillas dobles para realizar la sustitución de escape para todas las secuencias de escape, incluidas '\n' y '\r' . En PHP, para evitar problemas de portabilidad, las secuencias de nueva línea deben emitirse utilizando la constante PHP_EOL. [24]
Ejemplo en C# :
cadena eol = Medio ambiente . Nueva línea ; string lineColor = "Color: Rojo" + eol ; cadena eol2 = "\n" ; cadena lineColor2 = "Color: Azul" + eol2 ;
Las diferentes convenciones de nueva línea hacen que los archivos de texto que se han transferido entre sistemas de diferentes tipos se muestren incorrectamente.
El texto en archivos creados con programas que son comunes en Mac OS clásico o tipo Unix , aparece como una sola línea larga en la mayoría de los programas comunes en MS-DOS y Microsoft Windows porque estos no muestran uno solo ni uno como salto de línea.line feed
carriage return
Por el contrario, al visualizar un archivo originado en una computadora con Windows en un sistema tipo Unix, el CR adicional puede mostrarse como un segundo salto de línea, como ^M o como <cr> al final de cada línea.
Además, es posible que programas distintos a los editores de texto no acepten un archivo, por ejemplo algún archivo de configuración, codificado usando la convención de nueva línea externa, como un archivo válido.
El problema puede ser difícil de detectar porque algunos programas manejan correctamente las nuevas líneas extranjeras mientras que otros no. Por ejemplo, un compilador puede fallar con errores de sintaxis oscuros incluso aunque el archivo fuente parezca correcto cuando se muestra en la consola o en un editor . Los editores de texto modernos generalmente reconocen todos los tipos de nuevas líneas CR + LF y permiten a los usuarios realizar conversiones entre los diferentes estándares. Los navegadores web también suelen ser capaces de mostrar archivos de texto y sitios web que utilizan diferentes tipos de nuevas líneas.
Incluso si un programa admite diferentes convenciones de nueva línea, estas características a menudo no están suficientemente etiquetadas, descritas o documentadas. Normalmente, se mostrará a los usuarios un menú o cuadro combinado que enumera diferentes convenciones de nueva línea sin indicar si la selección reinterpretará, convertirá temporalmente o convertirá permanentemente las nuevas líneas. Algunos programas convertirán implícitamente al abrir, copiar, pegar o guardar, a menudo de manera inconsistente.
La mayoría de los protocolos textuales de Internet (incluidos HTTP , SMTP , FTP , IRC y muchos otros) exigen el uso de ASCII CR + LF ( '\r\n' , 0x0D 0x0A ) en el nivel de protocolo, pero recomiendan que las aplicaciones tolerantes reconozcan LF solitarios. ( '\n' , 0x0A ) también. A pesar del estándar dictado, muchas aplicaciones utilizan erróneamente la secuencia de escape de nueva línea C '\n' ( LF ) en lugar de la combinación correcta de escape de retorno de carro y secuencias de escape de nueva línea '\r\n' ( CR + LF ) (consulte la sección Nueva línea en lenguajes de programación anteriores). Este uso accidental de secuencias de escape incorrectas genera problemas al intentar comunicarse con sistemas que se adhieren a la interpretación más estricta de los estándares en lugar de la interpretación tolerante sugerida. Uno de esos sistemas intolerantes es el agente de transferencia de correo qmail que se niega activamente a aceptar mensajes de sistemas que envían LF simple en lugar del CR + LF requerido . [25]
El formato de mensaje de Internet estándar [26] para correo electrónico establece: "CR y LF sólo DEBEN aparecer juntos como CRLF; NO DEBEN aparecer de forma independiente en el cuerpo". Las diferencias entre las implementaciones de SMTP en la forma en que tratan los caracteres LF y/o CR han dado lugar a ataques de suplantación de SMTP denominados "contrabando de SMTP". [27]
El Protocolo de transferencia de archivos puede convertir automáticamente nuevas líneas en archivos que se transfieren entre sistemas con diferentes representaciones de nuevas líneas cuando la transferencia se realiza en "modo ASCII". Sin embargo, transferir archivos binarios en este modo generalmente tiene resultados desastrosos: cualquier aparición de la secuencia de bytes de nueva línea (que no tiene semántica de terminador de línea en este contexto, pero es solo parte de una secuencia normal de bytes) se traducirá a cualquier representación de nueva línea. el otro sistema utiliza, corrompiendo efectivamente el archivo. Los clientes FTP a menudo emplean algunas heurísticas (por ejemplo, inspección de extensiones de nombre de archivo ) para seleccionar automáticamente el modo binario o ASCII, pero al final depende de los usuarios asegurarse de que sus archivos se transfieran en el modo correcto. Si hay alguna duda sobre el modo correcto, se debe utilizar el modo binario, ya que FTP no alterará ningún archivo, aunque es posible que se muestren incorrectamente. [28]
Los editores de texto se utilizan a menudo para convertir un archivo de texto entre diferentes formatos de nueva línea; la mayoría de los editores modernos pueden leer y escribir archivos utilizando al menos las diferentes convenciones ASCII CR / LF .
Por ejemplo, el editor Vim puede hacer que un archivo sea compatible con el editor de texto del Bloc de notas de Windows. Dentro de vim
: establecer formato de archivo = dos : wq
Los editores pueden resultar inadecuados para convertir archivos más grandes o realizar conversiones masivas de muchos archivos. Para archivos más grandes (en Windows NT), se suele utilizar el siguiente comando:
D:\> TIPO archivo_unix | ENCONTRAR /V "" > archivo_dos
Los programas de propósito especial para convertir archivos entre diferentes convenciones de nueva línea incluyen unix2dos y dos2unix , mac2unix y unix2mac , mac2dos y dos2mac y flip . [29] El comando tr está disponible en prácticamente todos los sistemas tipo Unix y puede usarse para realizar operaciones de reemplazo arbitrarias en caracteres individuales. Un archivo de texto DOS/Windows se puede convertir al formato Unix simplemente eliminando todos los caracteres ASCII CR con
$ tr -d '\r' < archivo de entrada > archivo de salida
o, si el texto solo tiene líneas nuevas CR , convirtiendo todas las líneas nuevas CR a LF con
$ tr '\r' '\n' < archivo de entrada > archivo de salida
A veces se realizan las mismas tareas con awk , sed o en Perl si la plataforma tiene un intérprete de Perl:
$ awk '{sub("$","\r\n"); printf("%s",$0);}' archivo de entrada > archivo de salida # UNIX a DOS (agregando CR en sistemas operativos basados en Linux y BSD que no tienen extensiones GNU) $ awk '{gsub("\r",""); print;}' archivo de entrada > archivo de salida # DOS a UNIX (eliminando CR en sistemas operativos basados en Linux y BSD que no tienen extensiones GNU) $ sed -e 's/$/\r/' archivo de entrada > archivo de salida # UNIX a DOS (agregando CR en sistemas operativos basados en Linux que usan extensiones GNU) $ sed -e 's/\r$//' archivo de entrada > archivo de salida # DOS a UNIX (eliminando CR en sistemas operativos basados en Linux que usan extensiones GNU) $ perl -pe 's/\r ?\n|\r/\r\n/g' archivo de entrada > archivo de salida # Convertir a DOS $ perl -pe 's/\r?\n|\r/\n/g' archivo de entrada > archivo de salida # Convertir a UNIX $ perl -pe 's/\r?\n|\r/\r/g' archivo de entrada > archivo de salida # Convertir a Mac antiguo
El comando de archivo puede identificar el tipo de finales de línea:
$ file myfile.txt myfile.txt: texto ASCII en inglés, con terminadores de línea CRLF
El comando Unix egrep (grep extendido) se puede utilizar para imprimir nombres de archivos de Unix o DOS (suponiendo que solo sean archivos de estilo Unix y DOS, no archivos de estilo clásico de Mac OS):
$ egrep -L '\r\n' myfile.txt # muestra el archivo de estilo UNIX (terminado LF) $ egrep -l '\r\n' myfile.txt # muestra el archivo de estilo DOS (terminado CRLF)
Otras herramientas permiten al usuario visualizar los caracteres EOL:
$ od -a miarchivo.txt $ cat -e miarchivo.txt $ cat -v miarchivo.txt $ hexdump -c miarchivo.txt
Dos formas de ver las nuevas líneas, las cuales son autoconsistentes , son que las nuevas líneas separan líneas o terminan líneas. Si una nueva línea se considera un separador, no habrá ninguna nueva línea después de la última línea de un archivo. Algunos programas tienen problemas para procesar la última línea de un archivo si no termina con una nueva línea. Por otro lado, los programas que esperan que se utilice una nueva línea como separador interpretarán una nueva línea final como el inicio de una nueva línea (vacía). Por el contrario, si una nueva línea se considera un terminador, se espera que todas las líneas de texto, incluida la última, terminen con una nueva línea. Si la secuencia de caracteres final en un archivo de texto no es una nueva línea, se puede considerar que la línea final del archivo es una línea de texto incorrecta o incompleta, o se puede considerar que el archivo está truncado incorrectamente.
En el texto destinado principalmente a ser leído por humanos utilizando software que implementa la función de ajuste de palabras , normalmente solo es necesario almacenar un carácter de nueva línea si se requiere un salto de línea, independientemente de si la siguiente palabra cabe en la misma línea, como entre párrafos. y en listas verticales. Por lo tanto, en la lógica del procesamiento de textos y en la mayoría de los editores de texto , la nueva línea se utiliza como un salto de párrafo y se conoce como "retorno duro", en contraste con los "retornos suaves" que se crean dinámicamente para implementar el ajuste de texto y se pueden cambiar con cada instancia de visualización. En muchas aplicaciones existe un carácter de control separado llamado "salto de línea manual" para forzar saltos de línea dentro de un solo párrafo. El glifo del carácter de control para un retorno forzado suele ser un pilcrow (¶), y para el salto de línea manual suele ser una flecha de retorno de carro (↵).
RI ( U +008D AVANCE DE LÍNEA INVERSA , [30] ISO/IEC 6429 8D, decimal 141) se utiliza para mover la posición de impresión hacia atrás una línea (haciendo avanzar el papel hacia atrás o moviendo el cursor de la pantalla hacia arriba una línea) de modo que Se pueden imprimir otros caracteres sobre el texto existente. Esto se puede hacer para ponerlos más en negrita o para agregar subrayados, tachados u otros caracteres como signos diacríticos .
De manera similar, PLD ( U +008B LÍNEA PARCIAL HACIA ADELANTE, decimal 139) y PLU ( U +008C LÍNEA PARCIAL HACIA ATRÁS, decimal 140) se pueden utilizar para avanzar o invertir la posición de impresión de texto en una fracción del espacio entre líneas verticales (normalmente, la mitad). ). Estos se pueden usar en combinación para subíndices (avanzando y luego invirtiendo) y superíndices (invirtiendo y luego avanzando), y también pueden ser útiles para imprimir signos diacríticos.
[D]espués de décadas de frustración y de tener que descargar un editor de texto real para cambiar una sola línea en un archivo de configuración desde un cuadro de Linux, Microsoft ha actualizado el Bloc de notas para poder manejar los caracteres de final de línea utilizados en Unix, Linux y Entornos macOS.
Al igual que con cualquier cambio en una herramienta establecida desde hace mucho tiempo, existe la posibilidad de que este nuevo comportamiento no funcione para sus escenarios, o tal vez prefiera desactivar este nuevo comportamiento y volver al comportamiento original del Bloc de notas. Para hacer esto, puede cambiar [...claves de registro...] para modificar cómo el Bloc de notas maneja el pegado de texto y qué carácter EOL usar cuando se presiona Enter/Return.
En caso de duda, transfiera en modo binario.