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.
- Types de Saut de Ligne basés sur des Caractères
- Sauts de Ligne en définissant une Longueur de Ligne Fixe
- Sauts de Ligne dans le Code Source HTML et autres Langages de Balisage
- Sauts de Ligne dans le Code Source des Langages de Programmation
- Détection du Type de Saut de Ligne des Fichiers
- Problèmes avec les Échanges des Fichiers
- Comment changer le Type de Saut de Ligne des Fichiers
- Fichiers avec Sauts de Ligne Mixtes
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éviation | Code (Hex/Déc) | Jeu de Caractères | Système/Utilisation |
CR LF | 0D 0A / 13 10 | ASCII | Windows, 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 |
LF | 0A / 10 | ASCII | Line 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 |
CR | 0D / 13 | ASCII | Carriage 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 |
RS | 1E / 30 | ASCII | Record Separator / Séparateur d'Enregistrements - QNX (avant l'implémentation POSIX avec la version 4) |
EOL | 9B / 155 | ATASCII | End Of Line - Atari 8-Bit Computer |
NL | 15 / 21 | EBCDIC | New Line - IBM Mainframe Systems tel que z/OS (OS/390) or IBM i (i5/OS, OS/400) |
LF | 25 / 37 | EBCDIC | Line Feed - Caractère EBCDIC pour le ASCII 0A |
RNL | 06 / 06 | EBCDIC | Require New Line (depuis 2007) |
76 / 118 | ZX80/ZX81 | Sinclair Research Home Computers Linebreak | |
VT | U+000B | Unicode | Vertical Tab / Onglet Vertical |
FF | U+000C | Unicode | Form Feed / Saut de Page |
NEL | U+0085 | Unicode | Next Line / Ligne Suivante |
LS | U+2028 | Unicode | Line Separator / Séparateur de Ligne |
PS | U+2029 | Unicode | Paragraph 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ère | Unicode Code Point | ASCII | EBCDIC | Entité HTML | Séquence d'Échappement | |||
CR | U+000D | 0D | 13 | 0D | 13 | 
 | | \r |
LF | U+000A | 0A | 10 | 25 | 37 | 
 | | \n |
CR LF | - | 0D 0A | 13 10 | 0D 25 | 13 37 | - | - | \r\n |
NEL/NL | U+0085 | - | 15 | 21 | … | … | \u0085 | |
VT | U+000B | 0B | 11 | 0B | 11 |  |  | \v |
FF | U+000C | 0C | 12 | 0C | 12 |  |  | \f |
LS | U+2028 | - | - | 
 | 
 | \u2028 | ||
PS | U+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ère | Unicode Code Point | ASCII | UTF‑7 | UTF‑8 | UTF‑16 LE | UTF‑16 BE | UTF‑32 LE | UTF‑32 BE |
CR | U+000D | 0D | 0D | OD | 0D 00 | 00 0D | 0D 00 00 00 | 00 00 00 0D |
LF | U+000A | 0A | 0A | 0A | 0A 00 | 00 0A | 0A 00 00 00 | 00 00 00 0A |
CR LF | - | 0D 0A | 0D 0A | 0D 0A | 0D 00 0A 00 | 00 0D 00 0A | 0D 00 00 00 0A 00 00 00 | 00 00 00 0D 00 00 00 0A |
NEL/NL | U+0085 | - | 2B 41 49 55 | C2 85 | 85 00 | 00 85 | 85 00 00 00 | 00 00 00 85 |
VT | U+000B | 0B | 2B 41 41 73 | 0B | 0B 00 | 00 0B | 0B 00 00 00 | 00 00 00 0B |
FF | U+000C | 0C | 2B 41 41 77 | 0C | 0C 00 | 00 0C | 0C 00 00 00 | 00 00 00 0C |
LS | U+2028 | - | 2B 49 43 67 | E2 80 A8 | 28 20 | 20 28 | 28 20 00 00 | 00 00 20 28 |
PS | U+2029 | - | 2B 49 43 6B | E2 80 A9 | 29 20 | 20 29 | 29 20 00 00 | 00 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:
- Si nous interprétons le caractère de saut de ligne comme un séparateur entre deux lignes, notre exemple aurait trois lignes: la première ligne avec le contenu "abc", la deuxième ligne avec le contenu "def", suivie d'une troisième ligne vide.
- Cependant, si nous interprétons le caractère de saut de ligne comme un terminateur de ligne, nous n'obtiendrons que deux lignes: la première ligne avec le contenu "abc" et "N" comme marqueur de fin de ligne ainsi que la deuxième ligne avec le contenu "def" et encore "N" comme terminateur.
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:
- TeX / LaTeX nous propose trois manières de marquer un saut de ligne: avec deux barres obliques "\\", avec "\newline" ou avec "\hfill \break".
- Markdown transforme les lignes vides en paragraphes et deux espaces ou plus à la fin d'une ligne en un saut de ligne.
- Dans le format RTF (Rich Text Format), les paragraphes peuvent être insérés avec "\par" (à partir de "paragraph(e)") et de simples sauts de ligne avec "\line".
- Creole utilise "\\linebreak" pour marquer les sauts de ligne.
- Dans le langage de description de page PostScript, les choses sont un peu différentes: ici, pour sortir du texte sur une nouvelle ligne, il faut utiliser la commande "moveto" pour se déplacer à la position de sortie souhaitée avant de spécifier le texte (dans le cas d'un saut de ligne, c'est-à-dire à l'emplacement de notre page où la nouvelle ligne doit commencer).
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:
Langage | Saut de Ligne Explicite | Saut de Ligne Système |
C | char 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; |
Java | String s = "-\r\n-"; | String s = System.lineSeparator(); String s = "-%n-"; |
JavaScript / TypeScript | var s = "-\n-"; | |
Delphi | var s: string; s := '-' + #13#10 + '-'; | var s: string; s := sLineBreak; |
Lazarus / FreePascal | var s: string; s := '-' + #13#10 + '-'; | var s: string; s := LineEnding; |
PHP | $s = "-\r\n-"; | $s = PHP_EOL; |
Python | s = "-\r\n-" | s = os.linesep |
Perl | my $s = "-\r\x0A-"; | my $s = "\n"; |
Haskell | "-\CR\LF-" :: [Char] | "\n" :: [Char] |
Visual Basic | Dim 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) |
SQL | UPDATE 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:
- Soit nous définissons notre saut de ligne explicitement en utilisant ses caractères, ce qui signifie que nous sommes fermement attachés à un type de saut de ligne spécifique (les exemples montrent chacun deux lignes avec le contenu "-" utilisant le saut de ligne Windows \r\n respectivement 0D 0A, 13 10 ou \CR\LF - on peut créer un saut de ligne Unix de la même manière en omettant \r, 0D, 13 ou \CR avec l'écriture de \n, 0A, 10 ou \LF seulement),
- soit nous définissons notre saut de ligne indépendamment de la plate-forme en utilisant certaines variables, constantes ou fonctions que le langage de programmation respectif met à notre disposition. L'avantage de ce dernier est que nous n'avons pas à nous soucier du système sur lequel notre programme s'exécute, puisque de cette façon, nous obtenons automatiquement le type de saut de ligne système approprié (si nous le voulons).
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:
- Dans certains langages de programmation tels que PHP et Perl, nous pouvons définir des chaînes en utilisant à la fois des guillemets simples ('texte') ainsi que des guillemets doubles ("texte"). Cependant, les séquences d'échappement telles que \r et \n ne sont automatiquement remplacées que si elles apparaissent entre guillemets doubles dans ces langues. Ainsi, "-\r\n-" créerait un saut de ligne entre les deux caractères "-" et "-" tandis que '-\r\n-' conserverait les caractères tels quels. Dans d'autres langages de programmation tels que JavaScript, TypeScript et Python, peu importe que nous utilisions des guillemets simples ou doubles. JavaScript et Python interprètent à la fois '\n' et "\n" comme une nouvelle ligne. En revanche, en C, C++, C#, Java et Haskell, cette question ne se pose même pas: dans ces langages de programmation, seuls les guillemets doubles sont utilisés pour les strings, tandis que les guillemets simples sont réservés aux chars.
- Bien que JavaScript et TypeScript comprennent à la fois \r et \n, nous devons néanmoins être prudents lorsque nous utilisons ces deux caractères ensemble: même sur les ordinateurs Windows, une alert("-\r\n-") ne produit pas une seule mais deux nouvelles lignes. Le JavaScript indépendant de la plate-forme (ainsi que TypeScript) interprète à la fois \r et \n comme leur propre saut de ligne. Pour créer un seul saut de ligne, nous devons utiliser \n, par exemple comme alert("-\n-"). Néanmoins, le texte dans ces langues peut certainement contenir la variante \r\n. Ceci doit être pris en compte, par exemple, lors du traitement des entrées utilisateur provenant d'un ordinateur Windows. De plus, les sauts LS et PS sont acceptés comme sauts de ligne dans l'entrée JavaScript, mais pas NEL, qui est interprété comme un espace. De plus, il convient de noter que si nous voulons générer du HTML avec notre code JavaScript ou TypeScript, ce qui compte ne sont pas les sauts de ligne basés sur les caractères \r ou \n, mais plutôt les balises HTML appropriées, que nous avons décrites dans la section sur sauts de ligne en HTML.
- Java fait la distinction entre \r, \n et %n. %n représente le saut de ligne système quelle que soit la plate-forme (c'est-à-dire \r\n si le programme s'exécute sous Windows, \n si le programme s'exécute sous Unix, Linux, macOS, etc.), tandis que \n représente explicitement le caractère U+000A (c'est-à-dire exclusivement le saut de ligne Unix LF) et \r représente explicitement le caractère U+000D (CR). readLine() de Java accepte à la fois CR, LF et CRLF comme sauts de ligne. Cependant, lors de la lecture du texte EBCDIC, le caractère EBCDIC NL n'est pas mappé à NEL (U+0085) mais à LF (U+000A).
- En C, C++, Perl et Haskell, \r et \n ne représentent pas automatiquement toujours exactement les caractères CR (U+000D) et LF (U+000A). Cela dépend du mode utilisé: Si un fichier est ouvert ou écrit, cela peut se faire soit en mode texte, soit en mode binaire. En mode binaire, \r et \n se comportent comme attendu. En mode texte, en revanche (basé sur le standard C), la séquence d'échappement \n représente à elle seule un saut de ligne système complet. Cela signifie que la simple utilisation de \n en mode texte sous Windows entraîne la sortie d'un saut de ligne CRLF complet, donc \n seul produit la sortie réellement attendue de \r\n. Si nous utilisons \r\n à la place, cela entraînerait une sortie de CRCRLF sous Windows, doublant ainsi CR (\r devient le premier CR, puis \n devient le deuxième CR et LF). Sur les systèmes Unix, cependant, \r\n entraînerait la sortie CRLF, puisqu'une nouvelle ligne Unix complète se compose uniquement du caractère LF. Pour cette raison, les exemples pour C, C++, Perl et Haskell utilisent explicitement \x0A ou \CR au lieu de \n, bien que \n fonctionnerait et imprimerait le caractère 0A (LF) dans tous les cas sous Unix et également en mode binaire sous Windows. Le problème est que ce problème n'apparaît que lorsqu'un programme est exécuté sous Windows. S'il est développé et testé sur un système Unix, le problème n'existe pas et ne peut donc pas être remarqué.
- En PHP, Python, C# et Java, cependant, il est garanti que \r représente toujours U+000D et \n représente toujours U+000A respectivement, que \r\n correspond toujours au saut de ligne Windows CRLF. Il n'y a pas de conversion automatique dans ces langues.
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:
- Un exemple de ceci est la constante "LineEnding" dans Lazarus et Free Pascal ("sLineBreak" est l'équivalent dans Delphi). Selon le système sur lequel nous compilons notre programme, cette constante contient le saut de ligne approprié. Ainsi, si nous compilons notre programme pour Windows, "LineEnding" contient les caractères CR et LF (c'est le saut de ligne Windows). Cependant, si nous compilons plutôt notre programme pour macOS ou Linux, "LineEnding" contient le saut de ligne Unix LF utilisé sous macOS et Linux. Donc, Lazarus nous donne le choix soit d'écrire #13#10 pour un saut de ligne fixe, soit de rester variable avec "LineEnding".
- Des concepts similaires existent également dans d’autres langages de programmation. Par exemple, PHP nous fournit la constante PHP_EOL dans le même but, alors qu'en Visual Basic la constante s'appelle vbNewLine.
- Comme expliqué en plus détail dans la dernière section, dans les langages de programmation C, C++, Perl et Haskell, nous pouvons utiliser la séquence d'échappement /n pour le saut de ligne système, qui dans la plupart des autres langages ne représente que le caractère LF.
- D'autres langages nous fournissent des fonctions pour obtenir le saut de ligne système: en Python, par exemple, cela peut être fait avec os.linesep, en C# nous pouvons utiliser Environment.NewLine dans le même but.
- Certains langages nous offrent même plusieurs options: par exemple, en Java, nous pouvons insérer le saut de ligne système soit avec la séquence d'échappement %n (au lieu de \n), soit en utilisant la fonction System.lineSeparator(). La situation est similaire avec Visual Basic, où nous disposons à la fois de vbNewLine et de System.Environment.NewLine (cependant, vbNewLine a maintenant été marqué comme deprecated et ne doit plus être utilisé).
- JavaScript, TypeScript et SQL, en revanche, n'ont pas de concept natif pour déterminer le saut de ligne système en raison de leur optimisation pour une utilisation indépendante de 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:
- Compter les sauts de ligne: Dans un premier temps, nous devons parcourir les octets respectivement les points de code des caractères du fichier, puis voir quel type de saut de ligne pourrait correspondre au profil que nous avons déterminé en utilisant cette approche. Par exemple, si notre fichier contient de nombreux points de code de type $0A (LF) mais pas un seul point de code de type $0D (CR), il s'agit probablement d'un fichier texte avec le type de saut de ligne Unix LF. D'un autre côté, si $0D et $0A apparaissent exactement le même nombre de fois et également dans une combinaison telle que chaque $0D est suivi d'un $0A, alors nous avons très probablement un fichier avec le type de saut de ligne Windows CRLF. Nous pouvons procéder de la même manière pour n'importe lequel des autres types de saut de ligne en question (pour un tableau récapitulatif des séquences d'octets possibles, voir la section sur les représentations en octets des caractères de saut de ligne dans différents encodages).
- Aucune découverte: Si nous n'avons pas trouvé un seul caractère dans notre fichier, qui pourrait apparaître dans un saut de ligne ou qui pourrait indiquer l'utilisation d'un certain type de saut de ligne, cela peut avoir deux raisons. Soit notre fichier ne contient pas du tout un saut de ligne mais se compose uniquement d'une seule ligne, soit il s'agit d'un fichier qui utilise la longueur de ligne fixe comme délimiteur de ligne. Si le deuxième cas s'applique, nous pouvons essayer de deviner une éventuelle longueur de ligne fixe en fonction de la structure du fichier (par exemple grâce à des modèles récurrents), mais sans information sur la longueur de ligne fixe qui a été choisie pour le fichier, cela devient très difficile. Également en raison de la faible prévalence des fichiers texte avec des longueurs de ligne fixes, en cas de doute dans un tel cas, nous devrions privilégier le saut de ligne préféré du système sur lequel nous ouvrons le fichier (pour éditer davantage le fichier).
- Comptage ambigu: Un autre problème peut survenir si notre comptage ne produit pas un résultat clair. Par exemple, notre fichier pourrait contenir à la fois des caractères CR et LF, mais pas le même numéro. Cela signifie que notre fichier ne peut pas être clairement classé comme fichier texte Windows (pour cela, il devrait y avoir le même nombre de caractères CR et LF dans le fichier), et le fichier ne peut pas non plus être clairement attribué au saut de ligne CR ou LF (pour cela, l'autre type ne doit pas du tout apparaître dans le fichier). Nous abordons ce cas particulier dans la section "Fichiers avec des sauts de ligne mixtes" de cet article.
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:
- Par exemple, un fichier créé sous Linux apparaît soudainement sans saut de ligne sous Windows, car Windows attend un caractère de plus pour un saut de ligne complet que Linux n'a écrit dans le fichier: le fichier entier est ainsi affiché sous la forme d'une seule longue ligne. La situation est similaire lorsque l'on essaie d'utiliser un éditeur de texte Windows pour ouvrir un fichier créé sur un Mac ou un autre système Unix (qui ne peut pas gérer ce type de saut de ligne).
- À l'inverse, les fichiers texte créés sous Windows peuvent causer la duplication de tous les sauts de ligne sur les systèmes Unix, car certains éditeurs Unix interprètent à la fois CR ainsi que LF comme un seul saut de ligne, même si ces deux caractères sont considérés ensemble comme un seul saut de ligne sous Windows. Certains éditeurs affichent également le saut de ligne supplémentaire sous la forme ^M ou <cr> à la fin de chaque ligne. Le problème des doubles sauts de ligne est également facilité sur les systèmes macOS pour des raisons historiques: étant donné que le système précédent, Mac OS Classic jusqu'à la version 9, utilisait le caractère CR au lieu du LF actuel comme séparateur de ligne, également de nombreux programmes macOS modernes interprètent encore non seulement LF mais aussi le caractère CR comme un saut de ligne complet.
- Si nous utilisons des fichiers avec une longueur de ligne fixe, d'une part, nous devons informer le destinataire du nombre de caractères par ligne et, d'autre part, nous devons nous assurer que notre destinataire peut ouvrir le fichier, car très peu de programmes prennent en charge les fichiers texte avec une longueur de ligne fixe.
- Les choses peuvent également se compliquer lorsqu'il s'agit de fichiers qui utilisent l'un des types de saut de ligne les moins courants tels que VT, FF, NEL, LS ou PS. Par exemple, l'éditeur de texte Windows par défaut "Bloc-Notes" ne reconnaissait aucun de ces types de saut de ligne jusqu'à Windows 11 et aimait interpréter NEL comme un caractère de points de suspension (…) selon le point de code de la page de codes Windows 85 du même numéro. Ce n'est qu'avec Windows 11 (ou aussi avec la mise à jour 1803 pour Windows 10) que le Bloc-Notes a été révisé et reconnaît désormais tous ces types de saut de ligne, à l'exception de NEL. Avant ce changement, l’éditeur Windows ne reconnaissait même pas le saut de ligne LF répandu mais non système. L'éditeur de texte Linux par défaut de l'environnement de bureau GNOME (Ubuntu, Fedora, Debian, Suse) "gedit" reconnaît au moins LS et PS, mais pas VT, FF et NEL. Seul l'éditeur de texte par défaut "TextEdit" de macOS reconnaît correctement, outre les types de saut de ligne CR, LF et CRLF fréquemment utilisés, tous les caractères de saut de ligne supplémentaires VT, FF, NEL, LS et PS requis par la norme Unicode.
- Avec les types de sauts de ligne historiques tels que RS, EOL ou Sinclair, nous ne pouvons même pas nous attendre à ce qu'un éditeur de texte normal reconnaisse les fichiers tout seul sans paramètres supplémentaires.
- Si un fichier texte provenant d'un autre système n'est pas simplement destiné à être affiché dans un éditeur de texte mais est utilisé, par exemple, comme fichier de configuration ou comme enregistrement de données, il peut arriver que le programme en question ne reconnaisse même pas le fichier ou n'interprète pas ce fichier incorrectement. De plus, ces erreurs n'apparaissent parfois que tardivement ou les programmes concernés émettent des messages d'erreur difficiles à interpréter.
- Pour empirer les choses, la façon dont les programmes traitent les types de sauts de ligne étrangers peut varier considérablement. Certains programmes tels que les navigateurs, qui doivent naturellement traiter les fichiers texte de n'importe quel système comme peut-être aucune autre classe de programme, car pour un site Web, il est totalement difficile de savoir sur quel système le code source sous-jacent a été créé, acceptent généralement chacun des caractères mentionnés sous forme de saut de ligne. D'autres programmes peuvent être très stricts et n'accepter qu'un seul caractère spécifique. Toutes les nuances sont envisageables entre ces deux extrêmes.
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:
- Tout d’abord, faites glisser tous les fichiers dont vous souhaitez modifier le type de saut de ligne sur le TextEncoder. Alternativement, vous pouvez également ouvrir les fichiers individuellement ou rechercher des fichiers dans des dossiers entiers à l'aide de filtres arbitraires.
- Sur le côté droit de la fenêtre principale, sous "Modifications" > "Sauts de Ligne", sélectionnez le type de saut de ligne cible souhaité sous "Sauver sous", par exemple "CRLF - Windows" ou "LF - Unix".
- Facultatif: Sous "Lire comme", vous pouvez éventuellement spécifier quel type de saut de ligne doit être utilisé pour lire les fichiers. Par défaut, l'option "Détection automatique" est utilisée, ce qui devrait suffire dans la plupart des cas. Toutefois, pour les types de saut de ligne plus exotiques, tels que les sauts de ligne définis par une longueur de ligne fixe ou les sauts de ligne basés sur des points de code définis par l'utilisateur, vous devez effectuer une sélection correspondante ici.
- En bas à droite de la fenêtre principale, vous trouverez les Options de Sauvegarde. Ici, vous décidez si vous souhaitez écraser le fichier original respectif ou si vous souhaitez stocker les fichiers convertis en tant que nouveaux fichiers, par exemple dans un nouveau dossier.
- Enfin, vous devez cliquer sur le bouton "Convertir et Sauver" sous les options de stockage. Cela modifiera le saut de ligne de tous les fichiers actuellement dans la liste de fichiers du programme en fonction de vos paramètres actuels.
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.