web-dev-qa-db-fra.com

Pourquoi Windows utilise CR LF?

Je comprends la différence entre les deux, donc il n’est pas nécessaire d’y entrer, mais je me demande simplement quel est le raisonnement derrière la raison pour laquelle Windows utilise à la fois CR et LF pour indiquer un saut de ligne. Il semble que la méthode Linux (en utilisant simplement LF) a beaucoup plus de sens, économise de l'espace et est plus facile à analyser.

71
Kyle

Historiquement lors de l'utilisation imprimantes matricielles télétypes CR ramènerait le chariot à la première position de la ligne tandis que LF alimenterait la ligne suivante. L'utilisation de CR + LF dans le fichier lui-même permettait de envoyer un fichier directement à l'imprimante, sans aucun type de pilote d'imprimante.

Merci @zaph de souligner qu'il s'agissait de télétypes et non d'imprimantes matricielles

80
Anders Abel

@sshannin a publié une URL sur le blog de Raymond Chen, mais cela ne fonctionne plus. Le blog a changé son logiciel interne, donc les URL ont changé.

Après avoir parcouru les anciens articles du nouveau blog, je l'ai trouvé ici .

Citation du blog:

Pourquoi le terminateur de ligne CR + LF?

Ce protocole remonte à l'époque des téléscripteurs. CR signifie "chariot retour" - le caractère de contrôle CR a renvoyé la tête d'impression ("chariot") à la colonne 0 sans faire avancer le papier. LF signifie "saut de ligne" - le caractère de contrôle LF a avancé le papier d'une ligne sans déplacer la tête d'impression. Donc, si vous vouliez retourner la tête d'impression à colonne zéro (prêt à imprimer la ligne suivante) et avancez le papier (pour qu'il imprime sur du papier frais), vous avez besoin à la fois de CR et de LF.

Si vous accédez aux divers documents de protocole Internet, tels que RFC 0821 (SMTP), RFC 1939 (POP), RFC 2060 (IMAP) ou RFC 2616 (HTTP), vous verrez qu'ils spécifient tous CR + LF comme séquence de terminaison de ligne. La vraie question n'est donc pas "Pourquoi CP/M, MS-DOS et Win32 utilisent-ils CR + LF comme terminateur de ligne?", Mais plutôt "Pourquoi d'autres personnes ont-elles choisi de différer de ces documents de normes et d'utiliser un autre terminateur de ligne ? "

Unix a adopté plain LF comme séquence de terminaison de ligne. Si vous regardez les options stty, vous verrez que l'option onlcr spécifie si un LF doit être changé en CR + LF. Si vous obtenez ce paramètre incorrect, vous obtenez un texte de marche d'escalier, où

chaque

ligne

commence

où la ligne précédente s'est arrêtée. Ainsi, même Unix, lorsqu'il est laissé en mode brut, nécessite CR + LF pour terminer les lignes. Le CR implicite avant LF est une invention Unix, probablement en tant qu'économie, car il enregistre un octet par ligne.

L'ascendance unix du langage C a porté cette convention dans la norme du langage C, qui ne nécessite que "\ n" (qui code LF) pour terminer les lignes, imposant aux bibliothèques d'exécution la charge de convertir les données brutes des fichiers en lignes logiques.

Le langage C a également introduit le terme "nouvelle ligne" pour exprimer le concept de "terminateur de ligne générique". On me dit que le comité ASCII a changé le nom du caractère 0x0A en "nouvelle ligne" vers 1996, donc le niveau de confusion a été augmenté encore plus.

Voici une autre discussion sur le sujet, dans une perspective Unix

J'ai changé ce deuxième lien en un instantané dans The Wayback Machine, car la page actuelle n'est plus disponible.

J'espère que cela répond à votre question.

21
OMA

Il vient des machines de téléscripteur (et des machines à écrire) de l'époque d'antan.

Auparavant, lorsque vous aviez fini de taper une ligne, vous deviez déplacer le chariot de la machine à écrire (qui tenait le papier et glissait vers la gauche pendant que vous tapiez) au début de la ligne (CR). Vous deviez ensuite avancer le papier d'une ligne (LF) pour passer à la ligne suivante.

Dans certains cas, vous ne souhaitiez peut-être pas le saut de ligne lors du retour du chariot, comme si vous alliez barrer un caractère avec un tiret (il vous suffit de l'écraser).

Mais en gros, cela se résume à la convention. DOS a utilisé la convention CR/LF complète et UNIX l'a raccourcie un peu. Maintenant, nous sommes coincés!

17
Dave Markle

D'autres ont donné la réponse, mais je voulais ajouter ... Je suppose que vous êtes trop jeune pour avoir utilisé une machine à écrire? ;) Le chariot est un tambour. Le déplacer horizontalement vers la droite ramène la tête de type stationnaire à la marge gauche de la page. La rotation du chariot à l'aide de votre doigt et de votre pouce fait avancer la page d'une ligne (s).

2
likejudo

J'ai vu plus d'un compte à l'effet que la raison pour envoyer deux caractères (et parfois plus) au lieu d'un était afin de mieux faire correspondre le taux de transfert de données au taux d'impression physique ( cela faisait longtemps il y a). Le déplacement de la tête d'impression a pris plus de temps que l'impression d'un seul caractère et l'envoi de caractères supplémentaires était un moyen d'empêcher le transfert de données de prendre le pas sur le périphérique d'impression. Donc, la raison pour laquelle nous avons plusieurs caractères pour la fin de ligne dans Windows est fondamentalement la même que la raison pour laquelle nous avons QWERTY claviers - il était destiné à ralentir les choses .

De toute évidence, la raison pour laquelle cette pratique se poursuit dans Windows à ce jour est basée sur une notion de compatibilité descendante continue et, finalement, sur une simple inertie.

Cependant, cette convention n'est pas strictement appliquée par Windows au niveau du système d'exploitation . Toute application Windows est libre d'ignorer la convention, selon les autres applications avec lesquelles elle essaie d'être compatible.

Fait intéressant, le article Wikipedia sur "Newline" , affirme que Windows 8 peut introduire un changement pour utiliser uniquement LF. L'article indique également que Mac OS X a introduit une transition de LF + CR à seulement LF.

1
nobar

De Wikipedia :

La séquence CR + LF était couramment utilisée sur de nombreux premiers systèmes informatiques qui avaient adopté des machines de téléscripteur, généralement un ASR33, comme périphérique de console, car cette séquence était nécessaire pour positionner ces imprimantes au début d'une nouvelle ligne.

1
Nick Heidke