Intermédiaire 8 min de lecture 25 janvier 2025

Fin de ligne: problèmes courants dans vos fichiers

Tout fonctionne… sauf quand un CRLF traîne dans un projet en LF. Les parsers buguent, les diffs explosent, les tests comparent des chaînes différentes. La fin de ligne ne se voit pas, mais elle change tout. Voici ce qu'est une fin de ligne, pourquoi elle casse vos flux et comment la détecter.

Qu'est-ce qu'une fin de ligne ?

C'est la séquence de caractères qui marque la séparation entre deux lignes dans un fichier texte.

Voici les principales variantes de fin de ligne :

1 Fins de ligne ASCII classiques

LF (Unix), CRLF (Windows), CR (anciens Mac).

LF (10), CR (13), CRLF (13 10)

2 Caractères de contrôle liés aux lignes

Symboles de contrôle influençant le découpage et l'affichage.

CR (13), LF (10), VT (11), FF (12)

3 Séparateurs de ligne Unicode

Cas moins connus mais présents dans certaines données :

NEL (U+0085) - Next Line
LS (U+2028) - Line Separator
PS (U+2029) - Paragraph Separator
CRLF (U+000D U+000A) - Séquence Windows

4 Marques techniques

Éléments pouvant perturber la détection et la cohérence :

BOM (U+FEFF) - Influence la détection d'encodage/EOL
Mélange LF/CRLF - Lignes hétérogènes dans un même fichier
Pas de newline final - EOF sans fin de ligne

Problèmes classiques

Copier-coller entre environnements

Ajoute du CRLF dans un projet en LF (ou l'inverse) et casse les outils.

Tests unitaires qui échouent

Comparaison de chaînes: "\n" différent de "\r\n", assertions en échec.

Trim() ou strip() inefficace

Efface "\n" mais laisse "\r" en fin de ligne: les parsers continuent d'échouer.

Regex \s ou ancres incomplètes

[\r\n] ne couvre pas NEL/LS/PS; préférez \\R quand le moteur le permet.

Exemple de problème courant :

# Données qui semblent identiques mais pas la même fin de ligne
string1 = "email@domain.com\n"
string2 = "email@domain.com\r\n" # CRLF
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
Un diff git montre que tout le fichier a changé sans modification visible
!
Des parseurs CSV comptent une colonne de trop selon l'environnement
!
Un .env ne charge pas une clé car un CR résiduel traîne en fin de ligne
!
Votre éditeur affiche ^M au bout des lignes
!
Un copier-coller dans le terminal ajoute un CR et la commande échoue

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII repère et met en évidence les fins de ligne hétérogènes. Il affiche précisément où se trouvent les CR, LF, CRLF et séparateurs Unicode, et propose une normalisation cohérente.

✅ Détection automatique

CR, LF, CRLF, NEL, LS, PS et mélanges par fichier

📊 Analyse complète

Positions, compte par type, recommandations de conversion

🧹 Nettoyage automatique

Conversion vers LF, CRLF ou CR selon votre choix

💾 Export propre

Téléchargement du texte normalisé prêt à intégrer

Autres méthodes de détection

Affichage dans l'éditeur

Activez l'indicateur de fin de ligne (LF/CRLF) et le rendu des symboles
Installez un linter qui signale les fins de ligne incohérentes

En ligne de commande (Unix)

# Trouver les retours chariot (CR, ^M)
grep -n $'\r' fichier.txt
# Voir clairement LF/CRLF et la fin de ligne
sed -n l fichier.txt
# Afficher les caractères de contrôle (^M)
cat -A fichier.txt
# Voir les octets (0d 0a, 0a)
hexdump -C fichier.txt

En code

JavaScript

const normalized = str.replace(/\r\n?/g, '\n');

Python

import re; normalized = re.sub(r'\r\n?|\u0085|\u2028|\u2029', '\n', s)

Excel / Google Sheets

SUBSTITUE(SUBSTITUE(cellule;CAR(13)&CAR(10);CAR(10));CAR(13);CAR(10))

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant d'écrire des scripts, utilisez Clean ASCII pour normaliser instantanément vos fins de ligne.

Détection des EOL hétérogènes
Normalisation LF/CRLF/CR
Export immédiat

Méthodes techniques avancées

🔧 Normaliser

Fixez un format (souvent LF) et appliquez-le partout
Utilisez .gitattributes (text eol=lf) et git config core.autocrlf
Outils dos2unix/unix2dos et EditorConfig (end_of_line=lf)

🧹 Filtrer

Écrivez des fonctions normalize_eol() qui transforment CR/CRLF en LF
Ajoutez une fin de ligne au dernier fichier si elle manque
Rejetez NEL/LS/PS si votre pipeline ne les gère pas

⚙️ Automatiser

Hooks pre-commit pour refuser des CRLF indésirables (grep -n $'\r')
Tests qui valident la normalisation EOL des fixtures et exports
Linting EOL dans la CI (editorconfig-checker, eslint end-of-line)

Checklist rapide

Convention unique de fin de ligne (LF recommandé)
Gitattributes configuré (text eol=lf) et core.autocrlf maîtrisé
Éditeur affichant LF/CRLF et symbole ^M
Fonction de normalisation EOL dans vos libs
Tests empêchant les CR résiduels dans les données
Documentation équipe sur LF/CRLF et newline final

Conclusion

La fin de ligne est discrète mais décisive. En la maîtrisant, vous évitez des heures de debugging et de diffs inutiles.

Décidez d'une convention, détectez les incohérences, normalisez vos fichiers et vous éliminerez la majorité des problèmes de parsing et de versionning.

Normalisez vos fins de ligne maintenant

Utilisez notre outil pour identifier et harmoniser les fins de ligne dans vos fichiers.

Analyser mes fins de ligne