Centre d‘Information

Sauts de Ligne

Il existe plusieurs manières différentes d'implémenter les sauts de ligne dans les fichiers texte brut. Dans cet article, nous aimerions d'abord examiner ces différents types de types de sauts de ligne, puis aborder les problèmes qui peuvent survenir en raison de cette variabilité, ainsi que fournir des solutions et quelques exemples d'application à ces problèmes.

Fondamentalement, il existe trois catégories différentes dans lesquelles nous pouvons classer les différents types de sauts de ligne: les sauts de ligne basés sur des caractères, les sauts de ligne en définissant une longueur de ligne fixe, ainsi que les sauts de ligne implémentés par un langage de balisage. Dans les sections suivantes, nous aimerions d’abord comparer ces trois catégories et leurs représentants les plus éminents en guise d’introduction au sujet.

Types de Saut de Ligne basés sur des Caractères

La plupart des fichiers texte brut utilisent certains caractères ou octets préalablement définis pour marquer leurs sauts de ligne. Si le programme censé lire, traiter ou afficher un tel fichier texte connaît ces caractères, il sait que ces caractères ne doivent pas être affichés sous forme de lettres mais peuvent être interprétés comme des sauts de ligne (invisibles).

Cette approche serait facile à mettre en œuvre si un seul caractère spécifique pour un saut de ligne avait été convenu au fil du temps. Mais comme les différents systèmes se sont développés au fil du temps, ce n’est toujours pas le cas aujourd’hui. Ainsi, selon le système d'exploitation, d'autres caractères ou octets peuvent être utilisés pour un saut de ligne.

Caractères et Points de Code pour les Sauts de Ligne et leur Utilisation

Le tableau suivant donne un aperçu des différents caractères et combinaisons de caractères pour les sauts de ligne et des systèmes les plus courants utilisant chaque type de saut de ligne:

AbréviationCode (Hex/Déc)Jeu de CaractèresSystème/Utilisation
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 ainsi que la plupart des autres premiers systèmes d'exploitation non-Unix et non-IBM
LF0A / 10ASCIILine Feed / Changement de Ligne - Systèmes Unix et de type Unix (Linux, macOS, Mac OS X, Android, BSD, AIX, Xenix et ainsi de suite), Amiga, AmigaOS, QNX, Multics, BeOS, RISC OS et d'autres systèmes standard POSIX orientés
CR0D / 13ASCIICarriage Return / Retour Chariot - Mac OS (Classic) jusqu'à la version 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 / Séparateur d'Enregistrements - QNX (avant l'implémentation POSIX avec la version 4)
EOL9B / 155ATASCIIEnd Of Line - Atari 8-Bit Computer
NL15 / 21EBCDICNew Line - IBM Mainframe Systems tel que z/OS (OS/390) or IBM i (i5/OS, OS/400)
LF25 / 37EBCDICLine Feed - Caractère EBCDIC pour le ASCII 0A
RNL06 / 06EBCDICRequire New Line (depuis 2007)
 76 / 118ZX80/ZX81Sinclair Research Home Computers Linebreak
VTU+000BUnicodeVertical Tab / Onglet Vertical
FFU+000CUnicodeForm Feed / Saut de Page
NELU+0085UnicodeNext Line / Ligne Suivante
LSU+2028UnicodeLine Separator / Séparateur de Ligne
PSU+2029UnicodeParagraph Separator / Séparateur de Üaragraphe

Le jeu de caractères le plus répandu et le plus fréquemment utilisé dans le monde est l'ASCII (American Standard Code for Information Interchange), respectivement la norme Unicode basée sur l'ASCII. Les deux types de saut de ligne les plus courants et les plus répandus proviennent également de ce jeu de caractères: le saut de ligne Unix LF ainsi que le saut de ligne Windows CR LF.

Unix et le macOS actuel d'Apple utilisent le point de code Unicode U+000D comme saut de ligne, tandis que les anciens systèmes Apple utilisent U+000A. Windows et MS-DOS utilisent ces deux caractères l'un après l'autre dans l'ordre 0D0A. En plus de ces trois caractères et séquences de caractères, la norme Unicode requiert également les points de code U+000B (Vertical Tab VT, onglet vertical), U+000C (Form Feed FF, saut de page = nouvelle page), U +0085 (Next Line NEL, prochaine ligne), U+2028 (Line Separator LS, séparateur de ligne) et U+2029 (Paragraph Separator PS, séparateur de paragraphe) être interprétés comme un saut de ligne. Toutefois, à ce jour, seuls quelques programmes le font.

L'un des jeux de caractères les plus connus en dehors du monde ASCII est le jeu de caractères 8 bits EBCDIC (Extended Binary Coded Decimal Interchange Code) développé par IBM pour ses ordinateurs centraux (IBM Mainframe Systems). Ce jeu de caractères utilise le caractère hexadécimal 15 (décimal 21) pour un saut de ligne, qui combine les fonctions de CR et LF. De plus, EBCDIC contient également les caractères typiques ASCII CR et LF (bien que ces derniers sous un code de caractère différent) et, à partir de 2007, le caractère supplémentaire RNL (Required New Line - Nouvelle ligne requise), qui peut être utilisé pour coder un saut de ligne automatique conditionnel.

Moins courants ou seulement d'importance historique sont les sauts de ligne EOL (End Of Line) utilisés sur les ordinateurs Atari 8 bits (principalement utilisés dans les années 1980) à partir du jeu de caractères 8 bits ATASCII (ATARI Standard Code for Information Interchange) utilisé par Atari, les sauts de ligne des jeux de caractères ZX80 et ZX81 utilisés par Sinclair Research Ltd pour ses ordinateurs également dans les années 1980 ainsi que le saut de ligne RS (Record Separator), qui était utilisé par le système d'exploitation QNX jusqu'à la sortie de la version 4.0 dans 1990. Certains systèmes d'exploitation historiques définissaient même des sauts de ligne au niveau des bits: par exemple, les systèmes d'exploitation de la série CDC 6000 des années 1960, à une époque où la mémoire était coûteuse, définissaient leurs sauts de ligne comme deux caractères de 6 bits ou plus remplis de zéro bit à la fin d'un word de 60 bits.

Pourquoi le Saut de Ligne Windows se compose-t-il de deux Caractères?

Le fait que Windows, MS-DOS et la plupart des premiers systèmes d'exploitation non-Unix et non-IBM, contrairement aux autres systèmes d'exploitation mentionnés, définissent leurs sauts de ligne avec deux caractères a des raisons historiques et peut être attribué à la procédure de machines à écrire et anciens appareils d'impression:

Sur une machine à écrire, la coupure d'une ligne s'effectue notamment également par deux actions que l'on peut distinguer: d'une part, la position d'écriture revient au début de la ligne (retour chariot) et, d'autre part, la position d'écriture descend d'une ligne, par exemple en poussant plus loin le papier à imprimer en tournant le rouleau (changement de ligne). Selon cette logique, un "saut de ligne" complet est constitué d’une combinaison de ces deux actions. Lorsque les systèmes de jeux de caractères pour ordinateurs ont été développés dans les années 1960, dans ces jeux de caractères, des caractères de contrôle distincts pour le retour chariot ainsi que pour le changement de ligne ont été définis afin de pouvoir cartographier et mettre en œuvre le contrôle des imprimantes à cette époque dans de la même façon. Cette histoire se reflète encore dans les versions les plus récentes de Windows.

Le retour chariot (en anglais "Carriage Return" = CR) a reçu le code décimal 13 (hexadécimal 0D) dans le jeu de caractères ASCII de l'époque et est abrégé en "CR", le changement de ligne (en anglais "Line Feed" = LF) a reçu le code décimal 10 (hexadécimal 0A) et est abrégé "LF". Ces deux caractères peuvent encore être trouvés aujourd'hui dans la norme Unicode actuelle sous les mêmes points de code numériques.

Certains systèmes utilisaient également la distinction entre CR et LF pour divers effets de texte. Si seul CR sans LF était utilisé pour le contrôle de l'imprimante, un retour chariot sans changement de ligne pourrait être obtenu. De cette manière, la position d'écriture pourrait atteindre le début d'une ligne déjà imprimée et ainsi surimprimer le texte existant avec d'autres caractères. Par exemple, le texte pourrait ainsi être souligné, barré ou écrit en gras. Les caractères diacritiques en dehors du jeu de caractères réellement utilisé ont également été rendus possibles de cette manière par surimpression ou combinaison de différents caractères. De même, le caractère de contrôle RI (Reverse Line Feed = saut de ligne inversé) défini avec le point de code U+008D dans le standard Unicode peut être utilisé.

Unicode, ASCII, EBCDIC, Entités HTML et Séquences d'Échappement

Comme nous l'avons vu dans la section précédente, outre de nombreuses similitudes, il existe également certaines différences entre les différents jeux de caractères. C'est pour cette raison que nous aimerions comparer à nouveau les caractères concernés dans le tableau suivant:

CaractèreUnicode Code PointASCIIEBCDICEntité HTMLSéquence d'Échappement
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

Étant donné que la norme Unicode a complètement adopté tous les caractères du jeu de caractères ASCII avec des points de code identiques à ceux de son bloc "Basic Latin" pour des raisons de compatibilité, tous les caractères de saut de ligne du jeu de caractères ASCII tels que le saut de ligne LF, le retour chariot CR, l'onglet vertical VT ainsi que le saut de page FF sont définis à la fois dans le jeu de caractères ASCII et sous forme de points de code Unicode avec le même numéro.

De plus, la norme Unicode définit les points de code U+0085, U+2028 et U+2029 comme des sauts de ligne supplémentaires qui ne font pas partie du jeu de caractères ASCII. Les points de code Unicode U+2424 (Symbol for Newline, Symbole de nouvelle ligne), U+23CE (Return Symbol, Symbole de retour), U+240D (Symbol for Carriage Return, Symbole de retour chariot) ainsi que U+240A (Symbol for Line Feed, Symbole de saut de ligne) se distinguent de ces véritables sauts de ligne. Bien que ces caractères ne génèrent pas eux-mêmes des sauts de ligne, ils peuvent être utilisés pour créer des glyphes visibles par l'utilisateur afin de visualiser les caractères de saut de ligne autrement invisibles.

Le jeu de caractères EBCDIC, principalement utilisé sur les systèmes mainframe IBM, présente également de nombreux parallèles avec l'ASCII. Bien que le saut de ligne standard EBCDIC soit le caractère NEL (code hexadécimal 15 / code décimal 21), qui lui-même n'a pas d'équivalent ASCII, EBCDIC définit également des points de code pour les caractères CR, LF, VT et FF. Parmi ces quatre caractères, seul LF est défini sous un point de code différent de l'ASCII en EBCDIC (25/37 au lieu de 0A/10).

Le caractère Unicode équivalent à EBCDIC-NL est NEL (Next Line, Ligne suivante) et possède le point de code Unicode U+0085. Ce caractère a été défini dans la norme Unicode en plus de CR et LF pour permettre la conversion bidirectionnelle depuis et vers tous les autres codages. Si nous n'avions que les caractères CR et LF disponibles dans le standard Unicode, cela ne serait pas possible: par exemple, si nous voulions convertir un texte EBCDIC en Unicode et inversement, dans ce cas, nous pourrions d'abord convertir tous les sauts de ligne NEL en soit LF, soit CR LF. Cependant, lors d'une reconversion, nous serions confrontés à une ambiguïté, car EBCDIC fait une distinction entre CR, LF et NL et il ne serait donc plus clair si nos caractères LF et CR étaient déjà LF et CR auparavant (et devraient donc être conservés) ou ils étaient à l'origine un NL (qui devrait être reconvertie). Ainsi, uniquement parce que les trois caractères différents CR, LF et NEL sont également disponibles dans le standard Unicode, la transformation est possible sans perte d'informations.

De plus, les deux dernières colonnes du tableau affichent les entités HTML ainsi que les séquences d'échappement des caractères individuels. Les entités HTML peuvent être utilisées pour insérer les caractères respectifs dans le texte source HTML. Le tableau montre les entités HTML en notation hexadécimale et décimale. Ces deux variantes conduisent au même résultat et peuvent donc être utilisées de manière interchangeable. Pour le caractère LF, également l'entité HTML 
 peut être utilisé. De même, les séquences d'échappement de la dernière colonne sont aussi des espaces réservés pour les caractères mentionnés. Les séquences d'échappement peuvent être utilisées, par exemple, dans des expressions régulières ou dans certains langages de programmation comme alias respectivement pour insérer les caractères de saut de ligne correspondants. Plus d'informations à ce sujet dans la section sur les sauts de ligne dans le code du programme.

Les codages 8-Bit basés sur ASCII tels que les pages de codes Windows ou les jeux de caractères Latin ne sont pas répertoriés dans le tableau, car ces jeux de caractères ont également adopté tous les caractères ASCII et correspondent donc à la colonne "ASCII" du tableau.

Par souci d'exhaustivité, il convient également de mentionner qu'en plus de la norme Unicode courante la plus fréquemment utilisée, qui a adopté ses premiers points de code du jeu de caractères ASCII, il existe également une norme Unicode alternative appelée UTF-EBCDIC, qui est plutôt largement basé sur le jeu de caractères EBCDIC.

Représentations d'Octets dans différents Encodages

En fonction du codage utilisé, les points de code Unicode mentionnés génèrent différents octets dans un fichier stocké. Le tableau suivant donne un aperçu des séquences d'octets des différents types de saut de ligne dans les codages ASCII, UTF-7, UTF-8, UTF-16 Litte Endian et Big Endian ainsi que UTF-32 Litte Endian et Big Endian:

CaractèreUnicode 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

Les codages 8 bits typiques basés sur ASCII, tels que les pages de codes Windows ou les jeux de caractères Latin, ne sont pas répertoriés séparément dans le tableau. Ces codages utilisent les mêmes octets que l'ASCII, qui se trouvent dans la colonne ASCII. De nombreuses autres pages de codes et jeux de caractères ANSI suivent également cette convention.

Les représentations d'octets répertoriées dans ce tableau sont, entre autres, importantes pour la détection du type de saut de ligne des fichiers, ce que nous aborderons dans la section sur la reconnaissance du type de saut de ligne d'un fichier.

Caractères de Saut de Ligne comme Séparateurs ou Terminateurs de Ligne

Les caractères de saut de ligne peuvent être interprétés de deux manières différentes, chacune ayant ses défenseurs et ses applications: un caractère de saut de ligne peut être considéré soit comme un séparateur entre deux lignes, soit comme un marqueur de fin de ligne.

Pour illustrer cette différence, regardons l'exemple suivant, où "N" représente le caractère de saut de ligne:

abcNdefN

Le contenu d’un tel fichier pourrait être interprété de deux manières différentes:

Il existe des programmes qui considèrent les caractères de nouvelle ligne comme des séparateurs et d'autres programmes qui interprètent les caractères de nouvelle ligne comme des terminateurs. Les problèmes qui en résultent sont évidents: les programmes qui considèrent le caractère de saut de ligne comme séparateur peuvent trop interpréter une ligne (vide); les programmes qui considèrent le caractère de saut de ligne comme un marqueur de fin de ligne peuvent avoir des problèmes pour lire la dernière ligne d'un fichier.

Saisie de Caractères de Saut de Ligne

Le saut de ligne système est généralement plus simple à saisir à l’aide de la touche Entrée. Une exception se produit si la saisie est effectuée dans un éditeur qui comprend d'autres types de saut de ligne et dans lequel soit un fichier avec un type de saut de ligne non système est en cours de traitement, soit les paramètres de cet éditeur (ou d'un autre programme) sont définis sur un autre type de saut de ligne correspondant.

La saisie des autres types de saut de ligne est un peu plus difficile: certains systèmes et éditeurs de texte autorisent le raccourci clavier CTRL + J pour saisir le caractère LF. D'autres combinaisons de touches courantes sont CTRL + M pour CR ainsi que CTRL + K pour VT (c'est aussi la raison pour laquelle parfois ^M est affiché pour CR). Si nous interprétons CR et LF comme un retour chariot et un changement de ligne, nous pouvons le faire en utilisant les touches Pos1 et Flèche vers le bas.

Dans le code source HTML, des caractères de saut de ligne peuvent en outre être insérés via leurs entités HTML, qui sont répertoriées dans le tableau qui se trouve dans la section "Unicode, ASCII, EBCDIC, entités HTML et séquences d'échappement". De plus, nous pouvons saisir les caractères en utilisant le raccourci clavier ALT + Codepoint du caractère en utilisant le pavé numérique du clavier et dans certains contextes, comme dans les expressions régulières ou dans de nombreux langages de programmation, nous pouvons également utiliser les séquences d'échappement des caractères, qui sont également répertoriés dans le tableau mentionné pour chacun des caractères. Plus d'informations sur ce dernier dans la section sur les sauts de ligne dans le code source des langages de programmation.

Sauts de Ligne en définissant une Longueur de Ligne Fixe

Contrairement aux types de saut de ligne basés sur des définitions de caractères spécifiques introduits dans la section précédente, les fichiers texte avec une longueur de ligne fixe ne nécessitent pas la définition d'un ou plusieurs caractères pour un saut de ligne. Au lieu de cela, chaque ligne d'un tel fichier est basée sur une longueur de ligne qui peut initialement être librement sélectionnée, mais qui reste constante dans l'ensemble du fichier. Dans le fichier, toutes les lignes sont ensuite simplement écrites les unes après les autres et, si nécessaire, amenées à la longueur requise à l'aide d'un caractère de remplissage approprié.

Le contenu d'un tel fichier (ici comme exemple d'une longueur de ligne fixe de quatre caractères) peut alors ressembler à ceci:

ABCDABC ABCD

Un programme connaissant la longueur de ligne utilisée pour le fichier et pouvant l'afficher, peut alors interpréter ce contenu comme suit:

ABCD
ABC
ABCD

Étant donné que la deuxième ligne ne contient que trois caractères, nous avons utilisé ici un espace comme caractère de remplissage. Si nous ne l'avions pas fait, le "A" de la troisième ligne aurait été déplacé à la fin de la deuxième ligne.

Distribution et Domaines d'Application

Les fichiers avec une longueur de ligne fixe sont nettement moins courants que les fichiers qui implémentent leurs sauts de ligne avec un caractère de saut défini. La principale raison contre l’utilisation d’une longueur de ligne fixe est le manque de flexibilité. Après tout, très peu de textes comportent le même nombre de caractères dans chaque ligne.

Néanmoins, il existe des applications utiles pour de tels fichiers, par exemple dans le cas de données CSV ou d'autres ensembles de données dont les valeurs dans chaque ligne ont toutes la même longueur, de sorte que des caractères supplémentaires pour les sauts de ligne n'ajouteraient aucune information supplémentaire à l'interprétation de ces fichiers, afin que ces caractères puissent être omis en conséquence (en particulier dans les applications ou les environnements où la mémoire doit être économisée).

Fixed Line Length as System Line Break

La longueur de ligne fixe n'était utilisée que comme saut de ligne système sur certains des premiers ordinateurs centraux. À cette époque, des longueurs de ligne fixes de 72 ou 80 caractères étaient courantes sur de tels systèmes. Ce numéro était calqué sur les cartes perforées utilisées précédemment, qui comprenaient également généralement 80 colonnes par carte, dont les colonnes 73 à 80 étaient souvent utilisées pour les numéros de séquence. Certains de ces systèmes codaient les lignes de plus de 80 caractères en plaçant un caractère chariot tel que # comme premier caractère au début de la ligne suivante à relier.

Les systèmes de fichiers basés sur des records, tels que ceux utilisés par les systèmes d'exploitation OpenVMS, RSX-11 ou divers ordinateurs centraux plus récents, ne nécessitent pas non plus de caractère de saut de ligne. De tels systèmes stockent les fichiers texte sous la forme d'un record par ligne. Chacun de ces records contient un champ de longueur au début de la ligne dans lequel la longueur de la ligne respective est stockée individuellement. Cela signifie qu'aucun délimiteur de ligne supplémentaire sous la forme d'un caractère de contrôle n'est nécessaire, puisque le programme de lecture sait déjà, à partir de cette information, après combien de caractères la ligne se termine, respectivement combien de caractères doivent être lus pour lire une ligne. Même si le stockage de cette manière ne nécessite pas de caractère de saut de ligne, les systèmes de gestion d'enregistrements utilisés sont généralement capables de transmettre les lignes demandées à un programme demandeur avec un caractère de séparation de ligne si nécessaire.

Sauts de Ligne dans le Code Source HTML et autres Langages de Balisage

Outre les types de sauts de ligne basés sur des caractères et les sauts de ligne définis par une longueur de ligne fixe, que nous avons examinés dans les deux dernières sections, il existe une autre façon d'implémenter les sauts de ligne à l'aide d'un langage de balisage.

Sauts de Ligne dans le Code Source HTML

L'un des représentants les plus connus des langages de balisage est le code source HTML basé sur XML, la base des pages Internet telles que nous les connaissons aujourd'hui. L'implémentation des sauts de ligne dans le code source HTML et dans d'autres langages de balisage similaires est particulière car les sauts de ligne peuvent se produire à deux niveaux différents: Le texte source lui-même peut contenir des sauts de ligne basés sur des caractères tels que CRLF ou LF, mais ils restent masqués car l'affichage final des sauts de ligne sur le site Web, visibles ultérieurement dans le navigateur, est uniquement basé sur les balises HTML basées sur le texte et d'autres formatages tels que les feuilles de style CSS.

Pour illustrer cela, nous aimerions considérer deux sources HTML à titre d’exemple. D’une part, il y a le code source HTML suivant:

<h1>Titre</h1><p>Premier Paragraphe</p><p>Deuxième<br>Paragraphe</p>

Par contre, il y a ce code source:

<h1>Titre</h1>
<p>Premier Paragraphe</p>
<p>Deuxième<br>
Paragraphe</p>

Comme nous pouvons le constater, le premier exemple ne contient aucun saut de ligne "visible", tandis que dans le deuxième exemple, il y a un saut de ligne après chaque paragraphe significatif et à l'intérieur du deuxième paragraphe. Néanmoins, les deux codes sources conduisent exactement au même affichage dans le navigateur. Les espaces dits blancs (whitespace), tels que les espaces supplémentaires, les tabulations ou même les sauts de ligne, ne jouent aucun rôle dans l'interprétation du texte source.

La seule chose qui compte dans cet code source est que nous avons mis un texte dans une balise h1 ("titre 1" de l'anglais "heading") et deux autres textes dans une balise p (paragraphe de l'anglais "paragraph"). Par défaut (vous pouvez également remplacer ce comportement), ces balises sont toutes deux interprétées pour insérer un saut de ligne sous la forme d'un paragraphe après elles. La même chose s'applique aux balises comme h2 (titre 2), h3 (titre 3), li (éléments de liste) ou le classique saut de ligne HTML br (simple saut de ligne de l'anglais "break"), que nous avons utilisé pour envelopper le deuxième paragraphe. D'autres balises telles que les balises de formatage telles que b (bold / gras) ou i (italic / italique) n'insèrent pas de sauts automatiques dans l'affichage.

En revanche, les sauts de ligne classiques dans le texte source qui ne sont pas basés sur des balises peuvent être utilisés indépendamment de l'affichage dans le navigateur, par exemple pour structurer le texte source afin de le rendre plus lisible. Ces sauts de ligne, qui sont ensuite invisibles dans le navigateur, peuvent être utilisés sous forme de sauts de ligne basés sur des caractères ou, par exemple, ils peuvent être insérés via ce que l'on appelle des entités HTML, qui sont répertoriées dans la section sur les entités HTML.

Remplacer le Comportement avec la Balise pre

Ce comportement de sauts de ligne basés sur des caractères invisibles dans le texte source peut être remplacé à l'aide de la balise HTML "pre" ainsi que de l'attribut de style CSS "white-space:pre". Les sauts de ligne et autres whitespace tels que les espaces dans le texte source qui se trouvent dans une balise pre ou dans des balises avec la propriété CSS "white-space" avec la valeur "pre" sont affichés tels quels dans le navigateur:

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

Ce texte source crée quatre lignes réalignées dans le navigateur même si les sauts de ligne n'ont été écrits dans le texte source qu'en utilisant des "whitespace" autrement invisibles. Le saut de ligne entre la première et la deuxième ligne est créé par la balise pre, le saut de ligne entre la troisième et la quatrième ligne est créé par la propriété CSS de l'élément span englobant.

Sauts de Ligne dans LaTeX, Markdown, RTF, Creole, PostScript, BBCode et AsciiDoc

D'autres langages de balisage courants incluent LaTeX, Markdown, RTF, Creole et PostScript, chacun utilisant une syntaxe différente pour marquer les sauts de ligne:

Dans les langages de balisage tels que BBCode ou AsciiDoc, en revanche, malgré la possibilité d'autres balisages (tels que "[b]word[/b]" ou "*word*" pour le texte en gras), les sauts de ligne à partir du texte source sont également inclus dans le résultat. Ainsi, dans ces langages de balisage, le saut de ligne basé sur les caractères lui-même est utilisé comme balisage (ce qui est similaire au Markdown).

Conditions requises pour l'Utilisation des Langages de Balisage

La condition préalable à l'utilisation de langages de balisage tels que HTML, TeX/LateX, Markdown, RTF, Creole, PostScript, BBCode ou AsciiDoc est bien entendu que les balises, commandes et balises utilisées soient connues. Sans savoir comment un balisage spécifique est censé être utilisé ou interprété, une représentation n'est pas possible.

Sauts de Ligne dans le Code Source des Langages de Programmation

Dans le code source de la programmation, nous sommes également - similaire au texte source HTML- confrontés au problème de devoir faire une distinction entre le code source lui-même et ce qui est ensuite réellement affiché par le programme exécuté et éventuellement compilé. Il est important de maîtriser l’équilibre entre un code aussi lisible que possible, mais qui ne doit pas avoir d’impact négatif sur le programme.

Comme en HTML, cet exercice d'équilibre a été résolu à nouveau par le fait que de nombreux langages de programmation font une distinction stricte entre les sauts de ligne dans le code source et les sauts de ligne que le programme génère ensuite: Selon le système d'exploitation, les sauts de ligne habituels basés sur des caractères peuvent généralement être utilisés dans le code source, tandis que pour ceux du programme, il existe un langage de balisage pour générer des sauts de ligne, qui peut différer d'un langage de programmation à l'autre. Quelques exemples de ceci sont répertoriés dans le tableau suivant:

LangageSaut de Ligne ExpliciteSaut de Ligne Système
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) + '-'; 

Comme le montre le tableau, dans la plupart des langages de programmation, nous pouvons utiliser deux approches différentes pour insérer un saut de ligne:

Dans les deux sections suivantes, nous aimerions entrer plus en détail dans les deux variantes et leurs pièges.

Saut de Ligne Explicite

Dans de nombreux langages de programmation tels que C, C++, C#, Java, PHP, Python, Perl ou Haskell, les séquences d'échappement telles que \r et \n introduites dans la section "Types de saut de ligne basés sur des caractères" peuvent être utilisées pour insérer un saut de ligne dans une chaîne / string. Fondamentalement, \r représente un retour chariot (CR, U+000D) et \n un changement de ligne (LF, U+000A), qui permet de générer les sauts de ligne pour les différents systèmes.

Selon le langage de programmation, les aspects et particularités suivants doivent être pris en compte lors de l'utilisation de \r et \n:

La situation est quelque peu différente dans Delphi, Lazarus, Visual Basic et SQL. Au lieu des séquences d'échappement \r et \n, dans Visual Basic, nous pouvons utiliser les constantes vbCr et VbLf pour les caractères CR et LF. Il existe également la constante vbCrLf pour le saut de ligne Windows respectivement pour les deux caractères ensemble. Dans Delphi, FreePascal et Lazarus on peut insérer les caractères directement via leurs codes de caractères #13 (CR) et #10 (LF). La situation est la même dans le langage de base de données SQL, où nous pouvons de la même manière utiliser CHAR(13) et CHAR(10) pour générer les caractères correspondants.

Variables, Constantes et Fonctions pour le Saut de Ligne Système

En plus de cette définition explicite des sauts de ligne, la plupart des langages de programmation nous fournissent également des variables, des constantes ou des fonctions avec lesquelles le saut de ligne système respectif peut être inséré quelle que soit la plate-forme:

De cette façon, nous pouvons décider nous-mêmes si nous voulons utiliser explicitement un type de saut de ligne spécifique (par exemple parce que notre objectif est de sauvegarder des fichiers avec exactement ce type de saut de ligne) ou si notre programme doit automatiquement utiliser le saut de ligne système approprié (par exemple parce que notre programme doit produire une sortie appropriée sur différents systèmes).

Protocoles Réseau

L'utilisation du type de saut de ligne correct joue également un rôle important dans les protocoles réseau. Beaucoup de ces protocoles réseau, tels que HTTP, SMTP, FTP et IRC, sont basés sur du texte et utilisent le type de saut de ligne CRLF pour leurs requêtes transmises ligne par ligne.

Certains programmes adhèrent strictement à cette norme et refusent par conséquent de traiter les requêtes qui utilisent un type de saut de ligne différent tel que LF (comme qmail). D'autres programmes sont plus tolérants dans leur traitement ou utilisent même de manière incorrecte le type de saut de ligne système pour leurs requêtes, ce qui peut entraîner des problèmes de communication avec des systèmes qui implémentent plus strictement la norme. Certains de ces problèmes proviennent également de l'utilisation du \n typique du C qui, comme nous l'avons vu dans la section précédente, peut être résolu soit comme le CRLF correct, soit comme le LF incorrect dans les langages de programmation tels que C, C++, Perl et Haskell, selon sur le système d'exploitation et le mode.

Pour éviter ces problèmes, certains protocoles recommandent désormais de reconnaître également les types de saut de ligne autres que CRLF. Cependant, avec l'utilisation continue du CRLF, nous sommes toujours du bon côté, car nous ne savons pas quel programme éventuellement dépassé est utilisé de l'autre côté.

Détection du Type de Saut de Ligne des Fichiers

Contrairement à l'encodage de fichiers texte, dont nous pouvons écrire "l'ID d'encodage" pour certains encodages Unicode comme marque d'identification sous la forme d'un soi-disant marque d’ordre des octets (Byte Order Mark, BOM) au début d'un fichier texte, ce n'est pas si simple lorsqu'on essaie de reconnaître le type de saut de ligne d'un fichier texte. Pour le type de saut de ligne utilisé dans un fichier, il n'y a rien de comparable qui pourrait nous signaler le type de saut de ligne utilisé de la même manière que la BOM. Par conséquent, lorsque nous avons devant nous un fichier texte inconnu, il ne nous reste que quelques règles empiriques pour déterminer le type de saut de ligne de ce fichier.

Une première indication fournit le système d'exploitation sur lequel le fichier texte a été créé: si le fichier provient d'un ordinateur Windows, le saut de ligne Windows CR LF est probable. Cependant, si le fichier a été créé sur un Mac récent ou sous Linux, le fichier utilise probablement le saut de ligne de type Unix LF. Cependant, ce type de classification peut au mieux être une règle empirique, car il existe, par exemple, suffisamment d'éditeurs de texte pour Windows qui peuvent avoir prédéfini le saut de ligne Windows dans leurs paramètres par défaut, mais avec lesquels il est également possible de créer fichiers utilisant tout autre type de saut de ligne. En outre, il peut également être totalement difficile de savoir de quel système provient réellement un fichier.

Pour cette raison, lors de l’interprétation d’un fichier texte d’origine inconnue, nous ne devons pas nous fier à de telles conjectures mais plutôt essayer de prendre une décision basée sur les octets du fichier que nous connaissons. Par exemple, nous pouvons procéder de la manière suivante:

Heureusement, nous ne devons effectuer le travail décrit ici que si nous voulons programmer nous-mêmes une application capable de gérer tous les types de fichiers texte. Un programme qui peut déjà faire cela est le TextConverter: Par défaut, le TextConverter travaille avec l'option "Type de Saut de Ligne" > "Détection Automatique", ce qui signifie que le TextConverter effectue automatiquement l'analyse de vos fichiers comme décrit ici et que vous ne remarquez rien à ce sujet. Cependant, avec le TextConverter, il est bien sûr également possible de modifier ce paramètre par défaut et de lire ou d'enregistrer des fichiers avec tout autre type de saut de ligne. Avec le TextConverter, tous les types de saut de ligne présentés dans cet article peuvent être utilisés de la même manière qu'une longueur de ligne fixe ou un ou plusieurs caractères ou points de code définis par l'utilisateur comme saut de ligne.

Problèmes avec les Échanges des Fichiers

Les différents encodages pour les sauts de ligne peuvent causer de sérieux problèmes lors de l'échange de fichiers entre différents systèmes.

Les problèmes peuvent être de diverses natures:

Afin de rendre néanmoins ces fichiers lisibles sur le système de votre choix, il existe deux options: soit nous utilisons simplement un programme qui comprend également les types de sauts de ligne exotiques, soit nous échangeons le caractère pour le saut de ligne dans ces fichiers avant de continuer à les visualiser ou à les éditer. Nous verrons comment cela fonctionne dans la section suivante.

Comment changer le Type de Saut de Ligne des Fichiers

Si vous souhaitez lire des fichiers texte provenant d'autres systèmes d'exploitation ou d'autres sources qui utilisent un type de saut de ligne différent de celui de votre système d'exploitation de manière native sur votre système, vous pouvez réécrire les sauts de ligne des fichiers en question respectivement remplacer les sauts de ligne précédents par le type de saut de ligne que vous préférez. Une telle réécriture peut également être nécessaire si vous souhaitez lire vos fichiers texte avec un programme qui ne comprend qu'un certain type de saut de ligne et ne peut pas effectuer lui-même la conversion nécessaire.

Changer le Type de Saut de Ligne avec le TextEncoder

Quelle que soit la raison pour laquelle vous souhaitez modifier le type de saut de ligne des fichiers, vous pouvez facilement effectuer cette modification, même avec n'importe quel nombre de fichiers en même temps, à l'aide du logiciel TextEncoder. Pour ce faire, suivez simplement les étapes ci-dessous:

Le TextEncoder prend en charge tous les types de sauts de ligne basés sur des caractères présentés dans ce didacticiel ainsi que les sauts de ligne après un nombre fixe de caractères pour la lecture et l'enregistrement de fichiers texte. De plus, vous pouvez également définir et utiliser des sauts de ligne personnalisés via un ou plusieurs caractères ou points de code.

Si vous souhaitez automatiser le changement de saut de ligne d'un ou plusieurs fichiers (par exemple tous les fichiers d'un dossier spécifique) via un script, vous pouvez utiliser le TextEncoder dans sa version TextEncoder Pro CL.

Changer le Type de Saut de Ligne avec le TextConverter

Également avec l'application Text Converter, il est possible de modifier les sauts de ligne utilisés dans les fichiers texte. La procédure est la même que celle qui vient d'être décrite pour le TextEncoder. De plus, la sélection des types de saut de ligne pris en charge est identique à celle du TextEncoder.

Cependant, les options de saut de ligne dans le TextConverter ne se trouvent pas sous "Modifications > Sauts de Ligne" mais sous "Actions > Fichiers > Type de Saut de Ligne". De plus, vous pouvez également utiliser le TextConverter pour de nombreuses autres manipulations de fichiers texte brut, CSV ainsi que XML, tandis que le TextEncoder est uniquement destiné à modifier le type d'encodage et de saut de ligne des fichiers texte. Le Text Converter est également disponible en une version batch, qui peut être contrôlée et automatisée via la ligne de commande ou à l'aide d'un script.

Fichiers avec Sauts de Ligne Mixtes

Dans la section "Détection du type de saut de ligne d'un fichier", nous avions déjà évoqué le cas où certains fichiers texte peuvent contenir plusieurs types de sauts de ligne en même temps. Donc, aucun des types de saut de ligne possibles ne peut alors être attribué de manière claire et unique à un tel fichier.

Apparition de Fichiers avec des Sauts de Ligne Mixtes

De tels fichiers avec des sauts de ligne mélangés peuvent apparaître de différentes manières :

Il est possible, par exemple, qu'un fichier ait été modifié par différentes personnes sur différents systèmes. Par exemple, si ces personnes utilisent un éditeur de texte qui ne peut comprendre et écrire que leur propre type de saut de ligne système, ce qui suit peut rapidement se produire: La personne A crée un fichier texte sous Linux. À ce stade, le fichier résultant ne contient que le type de saut de ligne Unix LF. La personne B ouvre ensuite le fichier sous Windows et commence à ajouter quelques paragraphes. Ces nouveaux paragraphes sont écrits dans le fichier à l'aide du saut de ligne Windows CR LF, mais les anciens sauts de ligne LF restent intacts. Un tel fichier contient alors involontairement plusieurs types de sauts de ligne.

La même chose peut se produire si plusieurs fichiers provenant de différents systèmes sont ajoutés ensemble sans harmoniser au préalable le type de saut de ligne des fichiers.

Réparation de Fichiers avec des Sauts de Ligne Mixtes

Mais que faire quand il est déjà trop tard? Comment pouvons-nous réparer un tel fichier avec des sauts de ligne mixtes? Heureusement, nous n'avons pas besoin de le faire manuellement puisque nous pouvons simplement utiliser à nouveau le TextEncoder, qui a déjà été présenté dans la dernière section. Comment cela fonctionne exactement est expliqué dans le tutoriel "Comment réparer des Fichiers Texte avec des Sauts de Ligne mixtes".

Et que la prochaine fois, vous ne vous retrouverez plus avec des fichiers avec des sauts de ligne mixtes: le programme TextConverter peut joindre plusieurs fichiers texte ensemble, en tenant compte de leurs différents types de sauts de ligne. Et bien sûr sans que vous ayez à vous en soucier explicitement.