Centro de Información

Saltos de Línea

Hay varias formas diferentes de implementar saltos de línea en archivos de texto plano. En este artículo nos gustaría observar primero estos diferentes tipos de saltos de línea y luego abordar los problemas que pueden surgir debido a esta variabilidad, además de brindar soluciones y algunos ejemplos de aplicación para estos problemas.

Básicamente, existen tres categorías diferentes en las que podemos clasificar los distintos tipos de saltos de línea: saltos de línea basados en caracteres, saltos de línea mediante la definición de una longitud de línea fija, así como saltos de línea implementados mediante un lenguaje de marcado. En las siguientes secciones, primero nos gustaría comparar estas tres categorías y sus representantes más destacados a modo de introducción al tema.

Tipos de Salto de Línea basados en Caracteres

La mayoría de los archivos de texto plano utilizan ciertos caracteres respectivamente bytes previamente definidos para marcar sus saltos de línea. Si el programa que debe leer, procesar o mostrar dicho archivo de texto conoce estos caracteres, sabe que estos caracteres no deben mostrarse como letras, sino que pueden interpretarse como saltos de línea (invisibles).

Este enfoque sería fácil de implementar si se hubiera acordado a lo largo del tiempo un único carácter específico para un salto de línea. Sin embargo, debido a que los distintos sistemas han crecido históricamente, este todavía no es el caso hoy. Entonces, dependiendo del sistema operativo, se pueden usar otros caracteres o bytes para un salto de línea.

Caracteres y Puntos de Código para Saltos de Línea y su Uso

La siguiente tabla proporciona una descripción general de los diferentes caracteres y combinaciones de caracteres para saltos de línea y los sistemas más comunes que utilizan cada tipo de salto de línea:

AbreviaciónCódigo (Hex/Dec)Juego de CaracteresSistema/Uso
CR LF0D 0A / 13 10ASCIIWindows, MS-DOS, OS/2, Symbian OS, Palm OS, Atari TOS, CP/M, MP/M, RT-11, Amstrad CPC, DEC TOPS-10 así como la mayoría de los primeros sistemas operativos que no son Unix ni IBM
LF0A / 10ASCIILine Feed / Avance de Línea - Unix y sistemas similares a Unix (Linux, macOS, Mac OS X, Android, BSD, AIX, Xenix y así sucesivamente), Amiga, AmigaOS, QNX, Multics, BeOS, RISC OS y otros sistemas orientados al estándar POSIX
CR0D / 13ASCIICarriage Return / Retorno de Carro - Mac OS (Classic) hasta la versión 9, Apple II, Lisa OS, Commodore 64 (C64), Commodore 128 (C128), Acorn BBC, ZX Spectrum, TRS-80, Oberon, HP Series 80, MIT Lisp Machine, OS-9
RS1E / 30ASCIIRecord Separator / Separador de Registros - QNX (antes de la implementación de POSIX con la versión 4)
EOL9B / 155ATASCIIEnd Of Line - Atari 8-Bit Computer
NL15 / 21EBCDICNew Line - IBM Mainframe Systems tal como z/OS (OS/390) or IBM i (i5/OS, OS/400)
LF25 / 37EBCDICLine Feed - Carácter EBCDIC para 0A de ASCII
RNL06 / 06EBCDICRequire New Line (desde 2007)
 76 / 118ZX80/ZX81Sinclair Research Home Computers Linebreak
VTU+000BUnicodeVertical Tab / Pestaña Vertical
FFU+000CUnicodeForm Feed / Avance de Página
NELU+0085UnicodeNext Line / Proxima Linea
LSU+2028UnicodeLine Separator / Separador de Linea
PSU+2029UnicodeParagraph Separator / Separador de Párrafos

El juego de caracteres más extendido y utilizado en todo el mundo es el ASCII (American Standard Code for Information Interchange), respectivamente el estándar Unicode basado en ASCII. Los dos tipos de salto de línea más comunes y extendidos también provienen de este juego de caracteres: el salto de línea LF de Unix y el salto de línea CR LF de Windows.

Unix y el macOS actual de Apple utilizan el punto de código Unicode U+000D como salto de línea, mientras que los sistemas Apple más antiguos utilizan U+000A. Windows y MS-DOS utilizan ambos caracteres uno tras otro en el orden 0D0A. Además de estos tres caracteres y secuencias de caracteres, el estándar Unicode también requiere los puntos de código U+000B (Vertical Tab VT, pestaña vertical), U+000C (Form Feed FF, avance de página/salto de página = página nueva), U+0085 (Next Line NEL, siguiente línea), U+2028 (Line Separator LS, separador de línea) y U+2029 (Paragraph Separator PS, separador de párrafo) interpretarse como un salto de línea. Sin embargo, hasta la fecha sólo unos pocos programas hacen esto.

Uno de los conjuntos de caracteres más conocidos fuera del mundo ASCII es el conjunto de caracteres de 8 bits EBCDIC (Extended Binary Coded Decimal Interchange Code) desarrollado por IBM para sus computadoras centrales (IBM Mainframe Systems). Este juego de caracteres utiliza el carácter hexadecimal 15 (decimal 21) para un salto de línea, que combina las funciones de CR y LF. Además, EBCDIC también contiene los caracteres típicos de ASCII CR y LF (aunque este último con un código de carácter diferente) y, desde 2007, el carácter adicional RNL (Required New Line - Nueva línea requerida), que se puede utilizar para codificar un salto de línea automático condicional.

Menos comunes o solo de relevancia histórica son los saltos de línea EOL (End Of Line) utilizados en las computadoras Atari de 8 bits (utilizadas principalmente en la década de 1980) del juego de caracteres de 8 bits ATASCII (ATARI Standard Code for Information Interchange) utilizado por Atari, los saltos de línea de los juegos de caracteres ZX80 y ZX81 utilizados por Sinclair Research Ltd para sus computadoras también en la década de 1980, así como el salto de línea RS (Record Separator), que fue utilizado por el sistema operativo QNX hasta el lanzamiento de la versión 4.0 en 1990. Algunos sistemas operativos históricos incluso definieron nuevas líneas a nivel de bits: por ejemplo, los sistemas operativos de la serie CDC 6000 de la década de 1960, en una época en la que la memoria era costosa, definían sus saltos de línea como dos o más caracteres de 6 bits llenos de cero bits al final de una word de 60 bits.

¿Por qué el Salto de Línea de Windows consta de dos Caracteres?

El hecho de que Windows, MS-DOS y la mayoría de los primeros sistemas operativos que no son Unix ni IBM, a diferencia de los otros sistemas operativos mencionados, definan sus saltos de línea con dos caracteres tiene razones históricas y se remonta al procedimiento de máquinas de escribir y aparatos de impresión antiguos:

En una máquina de escribir, la ruptura de una línea también se realiza mediante dos acciones que se pueden distinguir entre sí: por un lado, la posición de escritura retrocede al principio de la línea (retorno de carro) y, por otro lado, la posición de escritura baja una línea, por ejemplo, empujando más el papel a imprimir girando el rodillo (avance de línea). Según esta lógica, un "salto de línea" completo se compone de una combinación de estas dos acciones. Cuando en los años 1960 se desarrollaron los sistemas de juegos de caracteres para ordenadores, en estos conjuntos de caracteres se definieron caracteres de control separados para el retorno de carro y para el avance de línea, con el fin de poder mapear e implementar el control de las impresoras en ese momento en de la misma manera. Esta historia todavía se refleja en las versiones más recientes de Windows.

El retorno de carro (en inglés "Carriage Return" = CR) recibió el código decimal 13 (hexadecimal 0D) en el juego de caracteres ASCII de la época y se abrevia como "CR", el avance de línea (en inglés "Line Feed" = LF) recibió el código decimal 10 (hexadecimal 0A) y se abrevia "LF". Ambos caracteres todavía se pueden encontrar hoy en el estándar Unicode actual bajo los mismos puntos de código numérico.

Algunos sistemas también utilizaron la distinción entre CR y LF para varios efectos de texto. Si solo se usara CR sin LF para el control de la impresora, se podría lograr un retorno de carro sin avance de línea. De esta forma, la posición de escritura podría llegar al principio de una línea ya impresa y así sobreimprimir el texto existente con otros caracteres. Por ejemplo, de esta forma el texto podría subrayarse, tacharse o escribirse en negrita. De esta manera también se hicieron posibles caracteres diacríticos fuera del juego de caracteres realmente utilizado mediante la sobreimpresión y combinación de diferentes caracteres. De manera similar, se puede utilizar el carácter de control RI (Reverse Line Feed = avance de línea inverso) definido con el punto de código U+008D en el estándar Unicode.

Unicode, ASCII, EBCDIC, Entidades HTML y Secuencias de Escape

Como vimos en la sección anterior, además de muchas similitudes, también existen ciertas diferencias entre los conjuntos de caracteres individuales. Por este motivo, nos gustaría volver a comparar los caracteres relevantes en la siguiente tabla:

CarácterUnicode Code PointASCIIEBCDICEntidad HTMLSecuencia de Escape
CRU+000D0D130D13

 \r
LFU+000A0A102537

\n
CR LF-0D 0A13 100D 2513 37--\r\n
NEL/NLU+0085-1521……\u0085
VTU+000B0B110B11\v
FFU+000C0C120C12\f
LSU+2028--

\u2028
PSU+2029--

\u2029

Dado que el estándar Unicode ha adoptado completamente todos los caracteres del juego de caracteres ASCII con puntos de código idénticos como su bloque "Basic Latin" (Latín básico) por razones de compatibilidad, todos los caracteres para saltos de línea del juego de caracteres ASCII, como el avance de línea LF, el retorno de carro CR, la pestaña vertical VT y el avance de página FF se definen tanto en el juego de caracteres ASCII como como puntos de código Unicode con el mismo número.

Además, el estándar Unicode define los puntos de código U+0085, U+2028 y U+2029 como saltos de línea adicionales que no forman parte del juego de caracteres ASCII. Para distinguirlos de estos saltos de línea reales están los puntos de código Unicode U+2424 (Symbol for Newline, Símbolo de nueva línea), U+23CE (Return Symbol, Símbolo de retorno), U+240D (Symbol for Carriage Return, Símbolo de retorno de carro), así como U+240A (Symbol for Line Feed, Símbolo de avance de línea). Aunque esos caracteres no generan un salto de línea por sí mismos, se pueden utilizar para crear glifos que sean visibles para el usuario con el fin de visualizar los caracteres de salto de línea que de otro modo serían invisibles.

El juego de caracteres EBCDIC, que se utiliza principalmente en sistemas mainframe IBM, también tiene muchos paralelos con ASCII. Aunque el salto de línea estándar de EBCDIC es el carácter NEL (código hexadecimal 15 / código decimal 21), que a su vez no tiene equivalente ASCII, EBCDIC también define puntos de código para los caracteres CR, LF, VT y FF. De estos cuatro caracteres, sólo LF está definido bajo un punto de código diferente de ASCII en EBCDIC (25/37 en lugar de 0A/10).

El carácter Unicode equivalente a EBCDIC-NL es NEL (Next Line, Siguiente línea) y tiene el punto de código Unicode U+0085. Este carácter se ha definido en el estándar Unicode además de CR y LF para permitir la conversión bidireccional desde y hacia todas las demás codificaciones. Si solo tuviéramos los caracteres CR y LF disponibles en el estándar Unicode, esto no sería posible: por ejemplo, si quisiéramos convertir un texto EBCDIC a Unicode y viceversa, en este caso primero podríamos convertir todos los saltos de línea NEL a ya sea LF o CR LF. Sin embargo, al volver a convertir nos encontraríamos con una ambigüedad, ya que EBCDIC distingue entre CR, LF y NL y, por lo tanto, ya no estaría claro si nuestros caracteres LF y CR ya eran antes LF y CR (y, por lo tanto, deberían mantenerse) o eran originalmente un NL (que tendría que volver a convertirse). Entonces, solo porque los tres caracteres diferentes CR, LF y NEL también están disponibles en el estándar Unicode, la transformación es posible sin pérdida de información.

Además, las dos últimas columnas de la tabla muestran las entidades HTML así como las secuencias de escape de los caracteres individuales. Las entidades HTML se pueden utilizar para insertar los caracteres respectivos en el texto fuente HTML. La tabla muestra las entidades HTML en notación hexadecimal y decimal. Estas dos variantes conducen al mismo resultado y, por tanto, pueden utilizarse indistintamente. Para el carácter LF, también la entidad HTML 
 puede ser usado. Del mismo modo, también las secuencias de escape de la última columna son comodines para los caracteres mencionados. Las secuencias de escape se pueden utilizar, por ejemplo, en expresiones regulares o en algunos lenguajes de programación como alias para insertar los caracteres de salto de línea correspondientes. Más sobre esto en la sección sobre saltos de línea en el código del programas.

Las codificaciones 8-Bit basadas en ASCII, como las páginas de códigos de Windows o los juegos de caracteres Latin, no aparecen en la tabla, ya que estos juegos de caracteres también han adoptado todos los caracteres ASCII y, por lo tanto, corresponden a la columna "ASCII" de la tabla.

En aras de la exhaustividad, también cabe mencionar que además del estándar Unicode común y más utilizado, que adoptó sus primeros puntos de código del juego de caracteres ASCII, también existe un estándar Unicode alternativo llamado UTF-EBCDIC, que en cambio, se basa ampliamente en el juego de caracteres EBCDIC.

Representaciones de Bytes en diferentes Codificaciones

Dependiendo de la codificación utilizada, los puntos de código Unicode mencionados generan diferentes bytes dentro de un archivo almacenado. La siguiente tabla ofrece una visión general de las secuencias de bytes de los distintos tipos de saltos de línea en las codificaciones ASCII, UTF-7, UTF-8, UTF-16 Litte Endian y Big Endian, así como UTF-32 Litte Endian y Big Endian:

CarácterUnicode Code PointASCIIUTF‑7UTF‑8UTF‑16 LEUTF‑16 BEUTF‑32 LEUTF‑32 BE
CRU+000D0D0DOD0D 0000 0D0D 00 00 0000 00 00 0D
LFU+000A0A0A0A0A 0000 0A0A 00 00 0000 00 00 0A
CR LF-0D 0A0D 0A0D 0A0D 00 0A 0000 0D 00 0A0D 00 00 00 0A 00 00 0000 00 00 0D 00 00 00 0A
NEL/NLU+0085-2B 41 49 55C2 8585 0000 8585 00 00 0000 00 00 85
VTU+000B0B2B 41 41 730B0B 0000 0B0B 00 00 0000 00 00 0B
FFU+000C0C2B 41 41 770C0C 0000 0C0C 00 00 0000 00 00 0C
LSU+2028-2B 49 43 67E2 80 A828 2020 2828 20 00 0000 00 20 28
PSU+2029-2B 49 43 6BE2 80 A929 2020 2929 20 00 0000 00 20 29

Las codificaciones típicas de 8 bits basadas en ASCII, como las páginas de códigos de Windows o los juegos de caracteres Latin, no se enumeran por separado en la tabla. Estas codificaciones utilizan los mismos bytes que ASCII, que se pueden encontrar en la columna ASCII. Muchas otras páginas de códigos ANSI y juegos de caracteres también siguen esta convención.

Las representaciones de bytes enumeradas en esta tabla son, entre otras cosas, importantes para la detección del tipo de salto de línea de archivos, que abordaremos en la sección sobre reconocimiento del tipo de salto de línea de un archivo.

Caracteres de Salto de Línea como Separadores o Terminadores de Línea

Los caracteres de salto de línea se pueden interpretar de dos maneras diferentes, las cuales tienen sus defensores y aplicaciones: un carácter de salto de línea puede considerarse como un separador entre dos líneas o como un marcador para el final de una línea.

Para demostrar esta diferencia, veamos el siguiente ejemplo, donde "N" representa el carácter de salto de línea:

abcNdefN

El contenido de dicho archivo podría interpretarse de dos maneras diferentes:

Hay programas que consideran los caracteres de nueva línea como separadores y otros programas que interpretan los caracteres de nueva línea como terminadores. Los problemas que resultan de esto son obvios: los programas que consideran el carácter de salto de línea como un separador pueden interpretar demasiado una línea (vacía); los programas que consideran el carácter de salto de línea como un marcador de fin de línea pueden tener problemas para leer la última línea de un archivo.

Entrada de Caracteres de Salto de Línea

El salto de línea del sistema suele ser más fácil de ingresar usando la tecla Enter. Se produce una excepción si la entrada se realiza dentro de un editor que comprende otros tipos de salto de línea y en el que actualmente se está trabajando en un archivo con un tipo de salto de línea que no es del sistema o la configuración de este editor (u otro programa) está configurada en otro tipo de salto de línea correspondiente.

Ingresar los otros tipos de salto de línea es un poco más difícil: algunos sistemas y editores de texto permiten el método abreviado de teclado CTRL + J para ingresar el carácter LF. Otras combinaciones de teclas comunes son CTRL + M para CR y CTRL + K para VT (esta es también la razón por la que a veces se muestra ^M para CR). Si interpretamos CR y LF como un retorno de carro y un avance de línea, podemos hacerlo usando las teclas Pos1 y Flecha abajo.

Dentro del código fuente HTML, los caracteres de salto de línea también se pueden insertar a través de sus entidades HTML, que se enumeran en la tabla que se puede encontrar en la sección "Unicode, ASCII, EBCDIC, Entidades HTML y Secuencias de Escape". Además, podemos ingresar los caracteres usando el atajo de teclado ALT + Punto de código del carácter usando el teclado numérico del teclado y en algunos contextos, como en expresiones regulares o en muchos lenguajes de programación, también podemos usar las secuencias de escape de los caracteres, que también son enumerados en la tabla mencionada para cada uno de los caracteres. Más sobre esto último en el apartado sobre saltos de línea en el código fuente de los lenguajes de programación.

Saltos de Línea mediante la Definición de una Longitud de Línea Fija

A diferencia de los tipos de salto de línea basados en definiciones de caracteres específicos que se introdujeron en la última sección, los archivos de texto con una longitud de línea fija no requieren la definición de uno o más caracteres para un salto de línea. En cambio, cada línea de dicho archivo se basa en una longitud de línea que inicialmente se puede seleccionar libremente, pero que se mantiene constante en todo el archivo. En el archivo se escriben simplemente todas las líneas una tras otra y, si es necesario, se llevan a la longitud deseada mediante un carácter de relleno adecuado.

El contenido de un archivo de este tipo (aquí, como ejemplo, con una longitud de línea fija de cuatro caracteres) puede tener el siguiente aspecto:

ABCDABC ABCD

Un programa que conoce la longitud de línea utilizada para el archivo y puede mostrarla, puede interpretar este contenido de la siguiente manera:

ABCD
ABC
ABCD

Dado que la segunda línea solo contiene tres caracteres, aquí utilizamos un espacio como carácter de relleno. Si no hubiéramos hecho eso, la "A" de la tercera línea se habría movido al final de la segunda línea.

Distribución y Áreas de Aplicación

Los archivos con una longitud de línea fija son significativamente menos comunes que los archivos que implementan sus saltos de línea con un carácter de salto definido. La principal razón en contra del uso de una longitud de línea fija es la falta de flexibilidad. Al fin y al cabo, muy pocos textos tienen el mismo número de caracteres en cada línea.

No obstante, existen algunas aplicaciones útiles para dichos archivos, por ejemplo en el caso de datos CSV u otros conjuntos de datos cuyos valores en cada línea tienen la misma longitud, por lo que los caracteres adicionales para los saltos de línea no agregarían más información a la interpretación de dichos archivos, de modo que estos caracteres puedan omitirse en consecuencia (especialmente en aplicaciones o entornos donde es necesario ahorrar memoria).

Longitud de Línea Fija como Salto de Línea del Sistema

La longitud de línea fija sólo se utilizó como salto de línea del sistema en algunas de las primeras computadoras centrales. En aquella época, en estos sistemas eran habituales líneas de longitud fija de 72 u 80 caracteres. Este número se inspiró en las tarjetas perforadas utilizadas anteriormente, que también incluían normalmente 80 columnas por tarjeta, de las cuales las columnas 73 a 80 se usaban a menudo para números de secuencia. Algunos de estos sistemas codificaban líneas de más de 80 caracteres colocando un carácter de carro como # como primer carácter al comienzo de la siguiente línea a vincular.

Los sistemas de archivos basados en records, como los utilizados por los sistemas operativos OpenVMS, RSX-11 o varias computadoras centrales más nuevas, tampoco requieren un carácter de salto de línea. Estos sistemas almacenan archivos de texto como un record/registro por línea. Cada uno de estos registros contiene un campo de longitud al principio de la línea en el que se almacena individualmente la longitud de la línea respectiva. Esto significa que no es necesario ningún delimitador de línea adicional en forma de un carácter de control, ya que el programa de lectura ya sabe a partir de esta información después de cuántos caracteres termina la línea o cuántos caracteres deben leerse para leer una línea. Incluso si el almacenamiento de esta manera no requiere un carácter de salto de línea, los sistemas de gestión de registros utilizados generalmente pueden pasar las líneas solicitadas a un programa solicitante con un carácter separador de línea si es necesario.

Saltos de Línea en Código Fuente HTML y otros Lenguajes de Marcado

Además de los tipos de salto de línea basados en caracteres y los saltos de línea definidos por una longitud de línea fija, que analizamos en las dos últimas secciones, existe otra forma de implementar saltos de línea utilizando un lenguaje de marcado.

Saltos de Línea en Código Fuente HTML

Uno de los representantes más conocidos de los lenguajes de marcado es el código fuente HTML basado en XML, la base de las páginas de Internet tal como las conocemos hoy. La implementación de saltos de línea en el código fuente HTML y en otros lenguajes de marcado similares es especial porque los saltos de línea pueden ocurrir en dos niveles diferentes: El texto fuente en sí puede contener cualquier salto de línea basado en caracteres, como CRLF o LF, pero ellos permanecen ocultos porque la visualización final de los saltos de línea en el sitio web que luego es visible en el navegador se basa únicamente en las etiquetas HTML basadas en texto y otros formatos, como las hojas de estilo CSS.

Para ilustrar esto, nos gustaría ver dos fuentes HTML como ejemplo. Por un lado, hay el siguiente código fuente HTML:

<h1>Título</h1><p>Primer Párrafo</p><p>Segundo<br>Párrafo</p>

Por otro lado, está este código fuente:

<h1>Título</h1>
<p>Primer Párrafo</p>
<p>Segundo<br>
Párrafo</p>

Como podemos ver, el primer ejemplo no contiene ningún salto de línea "visible", mientras que en el segundo ejemplo hay un salto de línea después de cada párrafo significativo y dentro del segundo párrafo. Sin embargo, ambos códigos fuente conducen a la misma visualización en el navegador. Los llamados espacios en blanco (whitespace), como espacios adicionales, tabulaciones o incluso saltos de línea, no desempeñan ningún papel en la interpretación del texto fuente.

Lo único que es importa en este código fuente es que hemos puesto un texto en una etiqueta h1 ("título 1" del inglés "heading") y otros dos textos en una etiqueta p (párrafo del inglés "paragraph"). De forma predeterminada (también puede anular este comportamiento), estas etiquetas se interpretan para insertar un salto de línea en forma de un párrafo después de ellas. Lo mismo se aplica a etiquetas como h2 (título 2), h3 (título 3), li (elementos de lista) o el clásico salto de línea HTML br (salto simple del inglés "break"), que utilizamos para envolver el segundo párrafo. Otras etiquetas, como las etiquetas de formato como b (bold / negrita) o i (italic / cursiva), no insertan saltos automáticos en la visualización.

Los saltos de línea clásicos en el texto fuente que no se basan en etiquetas, por el contrario, se pueden utilizar independientemente de la visualización en el navegador, por ejemplo para estructurar el texto fuente y hacerlo más legible. Estos saltos de línea, que luego son invisibles en el navegador, se pueden utilizar en forma de saltos de línea basados en caracteres o, por ejemplo, se pueden insertar a través de las llamadas entidades HTML, que se enumeran en la sección sobre entidades HTML.

Anular el Comportamiento con la Etiqueta pre

Este comportamiento de saltos de línea basados en caracteres invisibles en el texto fuente se puede anular utilizando la etiqueta HTML "pre", así como el atributo de estilo CSS "white-space:pre". Los saltos de línea y otros espacios en blanco (whitespace), como espacios en el texto fuente, que se encuentran dentro de una etiqueta pre o dentro de etiquetas con la propiedad CSS "white-space" con el valor "pre" se muestran como tales en el navegador:

<pre>Línea 1
Línea 2</pre>
<span style="white-space: pre">Línea 3
Línea 4</span>

Este texto fuente crea cuatro líneas rompersas en el navegador a pesar de que los saltos de línea solo se escribieron en el texto fuente utilizando "whitespace" invisibles. El salto de línea entre la primera y la segunda línea se crea mediante la etiqueta pre, el salto de línea entre la tercera y la cuarta línea se crea mediante la propiedad CSS del elemento span circundante.

Saltos de Línea en LaTeX, Markdown, RTF, Creole, PostScript, BBCode y AsciiDoc

Otros lenguajes de marcado comunes incluyen LaTeX, Markdown, RTF, Creole y PostScript, cada uno de los cuales usa una sintaxis diferente para marcar saltos de línea:

Por otro lado, en lenguajes de marcado como BBCode o AsciiDoc, a pesar de la posibilidad de otros marcados (como "[b]palabra[/b]" o "*palabra*" para texto en negrita), los saltos de línea del texto fuente también se incluyen en el resultado. Entonces, en estos lenguajes de marcado, el salto de línea basado en caracteres se usa como marcado en sí (lo que es similar a Markdown).

Requisitos para utilizar Lenguajes de Marcado

El requisito previo para utilizar lenguajes de marcado como HTML, TeX/LateX, Markdown, RTF, Creole, PostScript, BBCode o AsciiDoc es, por supuesto, conocer los marcados, comandos y etiquetas utilizados. Sin saber cómo se pretende utilizar o interpretar un marcado específico, no es posible una representación.

Saltos de Línea en el Código Fuente de Lenguajes de Programación

En el código fuente de la programación también nos enfrentamos - al igual que en el texto fuente HTML - al problema de quedebemos distinguir entre el código fuente en sí y lo que realmente muestra en el programa ejecutado y eventualmente compilado. Es importante gestionar el acto de equilibrio entre un código que sea lo más legible posible para los humanos, pero que no tenga un impacto negativo en el programa.

Como en HTML, este acto de equilibrio se resolvió nuevamente por el hecho de que muchos lenguajes de programación hacen una distinción estricta entre los saltos de línea en el código fuente y los saltos de línea que el programa genera posteriormente: Dependiendo del sistema operativo, generalmente se pueden utilizar los habituales saltos de línea basados en caracteres en el código fuente, mientras que para aquellos en el programa existe un lenguaje de marcado para generar saltos de línea, que puede diferir de un lenguaje de programación a otro. Algunos ejemplos de esto se enumeran en la siguiente tabla:

LenguajeSalto de Línea ExplícitoSalto de Línea del Sistema
Cchar s[] = "-\r\x0A-";char s[] = "\n";
C++std::string s = "-\r\x0A-";std::string s = "\n";
C#string s = "-\r\n-";string s = Environment.NewLine;
JavaString s = "-\r\n-";String s = System.lineSeparator();
String s = "-%n-";
JavaScript / TypeScriptvar s = "-\n-";
Delphivar s: string;
s := '-' + #13#10 + '-';
var s: string;
s := sLineBreak;
Lazarus / FreePascalvar s: string;
s := '-' + #13#10 + '-';
var s: string;
s := LineEnding;
PHP$s = "-\r\n-";$s = PHP_EOL;
Pythons = "-\r\n-"s = os.linesep
Perlmy $s = "-\r\x0A-"; my $s = "\n";
Haskell"-\CR\LF-" :: [Char]"\n" :: [Char]
Visual BasicDim s1 As String = "-" & vbCrLf & "-";
Dim s2 As String = "-" & vbCr & "-";
Dim s3 As String = "-" & vbLf & "-";
Dim s1 As String = System.Environment.NewLine;
Dim s2 As String = vbNewLine; (deprecated)
SQLUPDATE tab SET col = '-' + CHAR(13) + CHAR(10) + '-'; 

Como muestra la tabla, en la mayoría de los lenguajes de programación podemos utilizar dos enfoques diferentes para insertar un salto de línea:

En las dos secciones siguientes nos gustaría entrar en más detalles sobre ambas variantes y sus trampas.

Salto de Línea Explícito

En muchos lenguajes de programación como C, C++, C#, Java, PHP, Python, Perl o Haskell, las secuencias de escape como \r y \n introducidas en la sección "Tipos de salto de línea basados en caracteres" se pueden utilizar para insertar un salto de línea en una cadena / string. Básicamente, \r representa un retorno de carro (CR, U+000D) y \n un avance de línea (LF, U+000A), lo que permite generar saltos de línea para los diferentes sistemas.

Dependiendo del lenguaje de programación se deben tener en cuenta los siguientes aspectos y particularidades al utilizar \r y \n:

La situación es algo diferente en Delphi, Lazarus, Visual Basic y SQL. En lugar de las secuencias de escape \r y \n, en Visual Basic podemos usar las constantes vbCr y VbLf para los caracteres CR y LF. También existe la constante vbCrLf para el salto de línea de Windows respectivamente para ambos caracteres juntos. En Delphi, FreePascal y Lazarus podemos insertar los caracteres directamente mediante sus códigos de caracteres #13 (CR) y #10 (LF). La situación es similar en el lenguaje de base de datos SQL, donde podemos usar de manera similar CHAR(13) y CHAR(10) para generar los caracteres correspondientes.

Variables, Constantes y Funciones para el Salto de Línea del Sistema

Además de esta definición explícita de los saltos de línea, la mayoría de las lenguajes de programación también nos proporcionan variables, constantes o funciones con las que se puede insertar el respectivo salto de línea del sistema independientemente de la plataforma:

De esta manera, podemos decidir por nosotros mismos si queremos usar explícitamente un tipo de salto de línea específico (por ejemplo, porque nuestro objetivo es guardar archivos exactamente con este tipo de salto de línea) o si nuestro programa debe usar automáticamente el salto de línea apropiado del sistema (por ejemplo porque nuestro programa debería producir un resultado apropiado en diferentes sistemas).

Protocolos de Red

El uso del tipo de salto de línea correcto también juega un papel importante en los protocolos de red. Muchos de estos protocolos de red, como HTTP, SMTP, FTP e IRC, están basados en texto y utilizan el tipo de salto de línea CRLF para sus solicitudes transmitidas línea por línea.

Algunos programas se adhieren estrictamente a este estándar y, en consecuencia, se niegan a procesar solicitudes que utilizan un tipo de salto de línea diferente, como LF (como qmail). Otros programas son más tolerantes en su procesamiento o incluso utilizan incorrectamente siempre el tipo de salto de línea del sistema para sus solicitudes, lo que puede provocar problemas en la comunicación con sistemas que implementan el estándar de manera más estricta. Algunos de estos problemas también surgen del uso del \n típico de C que, como vimos en la sección anterior, puede resolverse como el CRLF correcto o como el LF incorrecto en lenguajes de programación como C, C++, Perl y Haskell, según sobre el sistema operativo y el modo.

Para evitar estos problemas, algunos protocolos recomiendan ahora también reconocer tipos de salto de línea distintos de CRLF. Sin embargo, con el uso continuado de CRLF todavía estamos en el lado correcto, ya que no sabemos qué programa posiblemente desactualizado se esté utilizando en el otro lado.

Detección del Tipo de Salto de Línea de Archivos

A diferencia de la codificación de archivos de texto, cuyo "ID de codificación" podemos escribir para determinadas codificaciones Unicode como marca de identificación en forma de la llamada marca de orden de bytes (Byte Order Mark, BOM) al principio de un archivo de texto, no es así de fácil al intentar reconocer el tipo de salto de línea de un archivo texto. Para el tipo de salto de línea utilizado en un archivo, no hay nada comparable que pueda indicarnos el tipo de salto de línea utilizado de forma similar a la BOM. Por lo tanto, cuando tenemos un archivo de texto desconocido frente a nosotros, lo único que nos queda son algunas reglas generales para determinar el tipo de salto de línea de este archivo.

Una primera indicación la proporciona el sistema operativo en el que se creó el archivo de texto: si el archivo se originó en una computadora con Windows, es probable que aparezca el salto de línea CR LF de Windows. Sin embargo, si el archivo se creó en una Mac reciente o en Linux, probablemente utilice el salto de línea LF de tipo Unix. Sin embargo, este tipo de clasificación puede ser, en el mejor de los casos, una regla general, ya que, por ejemplo, existen suficientes editores de texto para Windows que pueden tener preestablecido el salto de línea de Windows en su configuración predeterminada, pero con los que también es posible crear archivos que utilizan cualquier otro tipo de salto de línea. Además, es posible que no esté del todo claro de qué sistema procede realmente un archivo.

Por esta razón, al interpretar un archivo de texto de origen desconocido, no debemos confiar en tales conjeturas sino intentar tomar una decisión basada en los bytes del archivo que conocemos. Por ejemplo, podemos proceder de la siguiente manera:

Afortunadamente, sólo tendremos que hacer el trabajo aquí descrito si queremos programar nosotros mismos una aplicación que pueda manejar todo tipo de archivos de texto. Un programa que ya puede hacer esto es el TextConverter: De forma predeterminada, el TextConverter trabaja con la opción "Tipo de Salto de Línea" > "Detección Automática", lo que significa que el TextConverter realiza automáticamente el análisis de sus archivos como se describe aquí y usted no noto nada al respecto. Sin embargo, con el TextConverter también es posible cambiar esta configuración predeterminada y leer o guardar archivos con cualquier otro tipo de salto de línea. Con el TextConverter, todos los tipos de salto de línea presentados en este artículo se pueden usar de la misma manera como una longitud de línea fija o como caracteres o puntos de código definidos por el usuario como un salto de línea.

Problemas con el Intercambio de Archivos

Las diferentes codificaciones para los saltos de línea pueden causar serios problemas al intercambiar archivos entre diferentes sistemas.

Los problemas pueden ser de muy diversos tipos:

Para que sin embargo dichos archivos sean legibles en el sistema de su elección, hay dos opciones: o simplemente usamos un programa que también comprende tipos de saltos de línea exóticos, o cambiamos el carácter del salto de línea en estos archivos antes de verlos o editarlos más. Veremos cómo funciona esto en la siguiente sección.

Cómo cambiar el Tipo de Salto de Línea de Archivos

Si desea leer archivos de texto de otros sistemas operativos u otras fuentes que utilizan un tipo de salto de línea diferente al de su sistema operativo de forma nativa en su sistema, puede reescribir los saltos de línea de los archivos en cuestión y reemplazar los saltos de línea anteriores con el tipo de salto de línea que prefiera. Esta reescritura también puede ser necesaria si desea leer sus archivos de texto con un programa que sólo entiende un cierto tipo de salto de línea y no puede realizar la conversión necesaria por sí mismo.

Cambiar el Tipo de Salto de Línea con el TextEncoder

Independientemente del motivo por el que desee cambiar el tipo de salto de línea de los archivos, puede realizar este cambio fácilmente, incluso con cualquier número de archivos al mismo tiempo, utilizando el software TextEncoder. Para hacer esto, simplemente siga los pasos a continuación:

El TextEncoder admite todos los tipos de saltos de línea basados en caracteres presentados en este tutorial, así como saltos de línea después de un número fijo de caracteres, tanto para leer como para guardar los archivos de texto. Además, también puede definir y utilizar saltos de línea personalizados mediante uno o varios caracteres o puntos de código.

Si desea automatizar el cambio de salto de línea de uno o más archivos (por ejemplo, todos los archivos de una carpeta específica) mediante un script, puede utilizar el TextEncoder en su versión TextEncoder Pro CL.

Cambiar el Tipo de Salto de Línea con el TextConverter

También con la aplicación Text Converter es posible cambiar los saltos de línea utilizados en los archivos de texto. El procedimiento es el mismo que se acaba de describir para el TextEncoder. Además, también el surtido de tipos de salto de línea admitidos es idéntica a la de TextEncoder.

Sin embargo, las opciones de salto de línea en el TextConverter no se encuentran en "Cambios > Saltos de Línea" sino en "Acciones > Archivos > Tipo de Salto de Línea". Además, también puede utilizar el TextConverter para muchas otras manipulaciones de los archivos texto plano, CSV y XML, mientras que el TextEncoder solo está diseñado para cambiar la codificación y el tipo de salto de línea de archivos de texto. El Text Converter también está disponible en una versión por lotes, que puede controlarse y automatizarse mediante la línea de comandos o mediante un script.

Archivos con Saltos de Línea Mixtos

En la sección "Detección del tipo de salto de línea de un archivo" ya habíamos comentado el caso de que pueda haber archivos de texto que puedan contener varios tipos de saltos de línea al mismo tiempo. Entonces, ninguno de los posibles tipos de salto de línea podrá asignarse de forma clara y unívoca a dicho archivo.

Aparición de Archivos con Saltos de Línea Mixtos

Estos archivos con saltos de línea mezclados pueden aparecer de varias maneras:

Es posible, por ejemplo, que un archivo haya sido editado por diferentes personas en diferentes sistemas. Por ejemplo, si estas personas utilizan un editor de texto que solo puede comprender y escribir su propio tipo de salto de línea del sistema, puede suceder rápidamente lo siguiente: la persona A crea un archivo de texto en Linux. En este punto, el archivo resultante sólo contiene el tipo de salto de línea Unix LF. Luego, la persona B abre el archivo en Windows y comienza a agregar algunos párrafos. Estos nuevos párrafos se escriben en el archivo utilizando el salto de línea CR LF de Windows, pero los saltos de línea LF antiguos permanecen intactos. Un archivo de este tipo contiene involuntariamente varios tipos de saltos de línea.

Lo mismo puede suceder si se adjuntan varios archivos de diferentes sistemas sin armonizar primero el tipo de salto de línea de los archivos.

Reparación de Archivos con Saltos de Línea Mixtos

Pero ¿qué podemos hacer cuando ya es demasiado tarde? ¿Cómo podemos arreglar un archivo de este tipo con saltos de línea mixtos? Afortunadamente, no tenemos que hacer esto manualmente ya que podemos usar nuevamente el TextEncoder, que ya se presentó en la última sección. Cómo funciona esto exactamente se explica en el tutorial "Cómo reparar Archivos de Texto con Saltos de Línea mixtos".

Y que la próxima vez no vuelva a terminar con archivos con saltos de línea mixtos: el programa TextConverter puede unir varios archivos de texto, teniendo en cuenta sus diferentes tipos de saltos de línea. Y por supuesto sin que tenga que preocuparte explícitamente por ello.