Différence entre \ n et \ r?

609

Quelle est la différence entre \n(nouvelle ligne) et \r(retour chariot)?

En particulier, existe-t-il des différences pratiques entre \net \r? Y a-t-il des endroits où l'un devrait être utilisé au lieu de l'autre?

eozzy
la source
3
Toutes les réponses sont assez prévisibles, mais je serais intéressé de savoir s’il existe des différences PRATIQUES entre \ n et \ r. Y a-t-il des endroits où l'un devrait être utilisé par rapport à l'autre?
Vlad l'Impala
9
eh bien, oui, les fichiers texte avec seulement LF (nouvelle ligne) ne seront pas considérés comme terminés dans certaines applications Windows, et les fichiers texte terminés avec CRLF sembleront avoir des caractères supplémentaires s'ils sont ouverts dans certaines applications Linus.
pavium
2
oui, \ r est utilisé par certaines applications de console Linux pour faire une animation de ligne rotative.
Murali
8
\ R est-il vraiment toujours le Mac EOL normal? Je suis sûr que c'était pour Mac "classique", mais j'avais pensé qu'OS X avait Unixified. (Montre à quel point je connais les Mac, hein?)
John Y
11
historiquement, un \ n était utilisé pour déplacer le chariot vers le bas, tandis que le \ r était utilisé pour déplacer le chariot vers le côté gauche de la page.
karthik gorijavolu

Réponses:

827

En termes de code ascii, c'est 3 - car ils sont respectivement 10 et 13 ;-).

Mais sérieusement, il y en a beaucoup:

  • sous Unix et tous les systèmes de type Unix, \nest le code de fin de ligne, \rne signifie rien de spécial
  • en conséquence, en C et dans la plupart des langages qui le copient (même à distance), \nest la séquence d'échappement standard pour la fin de la ligne (traduite vers / depuis des séquences spécifiques au système d'exploitation si nécessaire)
  • dans les anciens systèmes Mac (pré-OS X), \rétait le code de fin de ligne à la place
  • sous Windows (et de nombreux anciens OS), le code de fin de ligne est de 2 caractères \r\n, dans cet ordre
  • comme conséquence (surprenante ;-) (qui renvoie aux systèmes d'exploitation beaucoup plus anciens que Windows), \r\nest la terminaison de ligne standard pour les formats de texte sur Internet
  • pour les "terminaux" électromécaniques de type télétype, \rcommande au chariot de reculer vers la gauche jusqu'à ce qu'il atteigne l'arrêt le plus à gauche (une opération lente), \ncommande au rouleau d'enrouler une ligne (une opération beaucoup plus rapide) - c'est la raison pour laquelle vous avez toujours \r avant \n , pour que le rouleau puisse se déplacer pendant que le chariot est toujours à gauche! -) Wikipedia a une explication plus détaillée .
  • pour les terminaux en mode caractère (émulant généralement des imprimantes encore plus anciennes comme ci-dessus), en mode brut, \ret \nagissent de manière similaire (sauf les deux en termes de curseur, car il n'y a pas de chariot ou de rouleau ;-)

En pratique, dans le contexte moderne de l'écriture dans un fichier texte, vous devez toujours utiliser \n(le runtime sous-jacent le traduira si vous êtes sur un système d'exploitation étrange, par exemple Windows ;-). La seule raison d'utiliser \rest si vous écrivez sur un terminal de personnage (ou plus probablement une "fenêtre de console" en émulant) et que vous voulez que la ligne suivante que vous écrivez écrase la dernière que vous venez d'écrire (parfois utilisée pour l'animation ascii maladroite " "effets des barres de progression, par exemple) - cela devient assez obsolète dans un monde de GUI, cependant ;-).

Alex Martelli
la source
12
Pour ajouter à l'historique de cette réponse: à mesure que la vitesse des lignes passait de 10 caractères par seconde, il fallait plus de 2 caractères pour que le chariot revienne et des caractères inoffensifs supplémentaires (généralement NUL, c'est-à-dire \0) ont été ajoutés après le \npour autoriser le supplément. temps. Cela a été géré de manière transparente par le système d'exploitation de sorte que vous n'en trouverez aucune trace dans le code hérité.
Mark Ransom
11
Comment Windows est-il un système d'exploitation «bizarre»?
mailmindlin
31
@mailmindlin - vous demandez "Comment Windows est-il un système d'exploitation" bizarre "?". Réponse: de plus de façons que je ne peux facilement en compter (tout en portant des chaussettes, donc les orteils ne sont pas autorisés :-). Tous les autres OS survivants sont basés sur Unix ... Windows est celui qui existe, WAY out à bien des égards. Dans le contexte de ce Q spécifique - c'est le seul qui propose DEUX octets (\ n \ r) comme fin de ligne canonique ... sans raison valable, sauf les anciens historiques expliqués ailleurs sur le fil ... tous les autres OS a un seul caractère de fin de ligne a5 (99% + d'entre eux `\ n ').
Alex Martelli
1
@nothingisnecessary: ​​Par exemple, tools.ietf.org/html/rfc5322 , qui a remplacé RFC 2822, définissant le format des messages électroniques.
Keith Thompson
3
Un petit conseil à tous ceux qui écriront un analyseur quelconque à un moment donné de leur vie - n'oubliez jamais de gérer correctement la fin des lignes. J'ai eu une expérience assez désagréable avec ça juste parce que j'ai oublié le \r(j'utilise Linux). Une fois que j'ai commencé à analyser ce qui semblait être un fichier valide, mon analyseur a échoué car le fichier que j'analysais a été créé dans Windows. : D Le principal problème dans tout ce qui est que ni \nou \rsont visibles dans le sens que , par exemple a, ., (etc. personnages sont.
rbaleksandar
122

Historiquement, a \nétait utilisé pour déplacer le chariot vers le bas, tandis que le \rétait utilisé pour déplacer le chariot vers le côté gauche de la page.

tster
la source
8
Ce n'est peut-être pas une réponse terriblement pratique à une question informatique, mais la friandise historique reçoit de toute façon un vote positif de ma part.
John Y
1
Imaginez \ r être similaire à lorsque vous poussez la partie de frappe de votre machine de frappe physique vers la gauche, alias. revenir.
Jo Smo
2
\ n ne déplace pas le chariot vers le bas, il tourne le rouleau pour déplacer le papier vers le HAUT.
Roddy
5
Tout mouvement est relatif. Le papier est mon monde, et par rapport à lui, le chariot descend: P
tster
2
FWIW, \ r peut toujours être un "retour chariot" sur les systèmes modernes. Considérez ce code C printf("abcdefghijlm\rNOP\n");compilé avec gcc-8 sur OpenSuSe et exécutez sur un terminal résulte en cette sortie NOPdefghijlm. Le \ r (retour chariot) dans la chaîne entraîne le déplacement du curseur au début de la ligne (chariot) et les caractères qui suivent le \ r (c'est-à-dire "NOP") écrasent ce qui était précédemment là-bas (c'est-à-dire "abc")! Vous pouvez obtenir un "mouvement de chariot" similaire avec un retour arrière (\ b) comme celui printf("abcdefghijlm\b\bNOP\n");qui produitabcdefghijNOP
GMc
36

Deux personnages différents.

\n est utilisé comme terminateur de fin de ligne dans les fichiers texte Unix

\r est utilisé comme terminateur de fin de ligne dans les fichiers texte Mac

\r\n (c'est-à-dire les deux) sont utilisés pour terminer les lignes dans les fichiers texte Windows et DOS.

pavium
la source
2
Notez que certains ordinateurs utilisaient \ n \ r comme marqueur de fin de ligne lorsque vous avez appuyé sur la touche ENTRÉE, comme Acorn et RISC OS.
Anders
9
Pour clarifier: ça \rn'a pas été la fin de la ligne sur un Mac depuis longtemps. Avec la sortie de Mac OS X en 2001 (qui est basé sur Unix), \nest maintenant utilisé.
jbbuckley
3
Mais il y a encore des applications qui utilisent \r- par exemple MS Office 2011 Excel: enregistrer un CSV (avec tous les paramètres par défaut) - enregistreront un fichier encodé ISO-8859-1 avec des \rterminaisons -line.
CodeBrauer
24

Étant donné que personne d'autre ne l'a mentionné spécifiquement (sont-ils trop jeunes pour le savoir / se souvenir?) - Je soupçonne l'utilisation d' \r\norigine pour les machines à écrire et les appareils similaires.

Lorsque vous vouliez une nouvelle ligne tout en utilisant une machine à écrire multi-lignes, il devait effectuer deux actions physiques: faire glisser le chariot vers le début (à gauche, aux États-Unis) de la page et faire avancer le papier d'un cran .

À l'époque des imprimeurs de lignes, la seule façon de faire du texte en gras, par exemple, était de faire un retour chariot SANS nouvelle ligne et d'imprimer les mêmes caractères sur les anciens, ajoutant ainsi plus d'encre, ce qui la rendait plus sombre (en gras) . Lorsque la fonction mécanique "nouvelle ligne" a échoué dans une machine à écrire, ce fut le résultat ennuyeux: vous pouviez taper sur la ligne de texte précédente si vous ne faisiez pas attention.

rien n'est nécessaire
la source
3
La norme ASCII pour la nouvelle ligne est \ r \ n. (Mis à part un bref intervalle lorsque Bell Telephone a pris le contrôle du comité des normes). En contrepartie du monopole du téléphone, Bell Telephone a abandonné l'activité de messagerie (télégramme, téléscripteur) et ne s'est pas souciée de l'utilisation actuelle de la norme. HTTP, HTML, PCDOS et MSDOS ont utilisé la norme ASCII. Bell Téléphone a choisi de ne pas utiliser la norme Unix parce qu'elle n'avait aucune entreprise existante avec laquelle être compatible.
david
12

Deux personnages différents pour différents systèmes d'exploitation. Cela joue également un rôle dans les données transmises TCP/IPqui nécessitent l'utilisation de\r\n .

\n Unix

\r Mac

\r\n Windows et DOS.

a432511
la source
10
Je pense que vous confondez avec les protocoles applicatifs, TCP / IP n'a aucune idée de \ n et \ r.
jean-loup
4
TCP / IP ne nécessite pas l'utilisation de \ r \ n. Divers protocoles basés sur Telnet l'exigent, notamment SMTP, POP3, FTP, HTTP, ...
Marquis de Lorne
9

Compléter,

Dans un script shell (bash), vous pouvez utiliser \rpour envoyer le curseur, devant en ligne et, bien sûr, \npour placer le curseur sur une nouvelle ligne.

Par exemple, essayez:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Le premier affichage "écho" AA--AA
  • La deuxième : AA--AABB
  • Le dernier : BB--AABB

Mais n'oubliez pas d'utiliser -encomme paramètres.

Akarun
la source
5

Dans Windows, le \ n se déplace au début de la ligne suivante. Le \ r se déplace au début de la ligne actuelle, sans passer à la ligne suivante. J'ai utilisé \ r dans mes propres applications de console où je teste du code et je ne veux pas voir le texte défiler vers le haut de mon écran, plutôt que d'utiliser \ n après avoir imprimé du texte, disons, une fréquence d'images ( FPS), je vais imprimerf ("% - 10d \ r", fps); Cela ramènera le curseur au début de la ligne sans descendre à la ligne suivante et me permettra d'avoir d'autres informations sur l'écran qui ne défilent pas pendant que le framerate est constamment mis à jour sur la même ligne (le% -10 fait certain que la sortie comporte au moins 10 caractères, justifiée à gauche pour qu'elle finisse par des espaces, écrasant toutes les anciennes valeurs de cette ligne). C'est assez pratique pour des trucs comme ça,

Un peu d'histoire

Le / r signifie "retour" ou "retour chariot" qui doit son histoire à la machine à écrire. Un retour chariot a déplacé votre chariot complètement vers la droite de sorte que vous tapiez au début de la ligne.

Le / n signifie "nouvelle ligne", encore une fois, depuis les jours de la machine à écrire, vous êtes passé à une nouvelle ligne. Pas nécessairement au début, c'est pourquoi certains systèmes d'exploitation ont adopté la nécessité d'un retour a / r suivi d'une nouvelle ligne / n, car c'était l'ordre dans lequel une machine à écrire l'a fait. Il explique également les anciens ordinateurs 8 bits qui utilisaient d'avoir "Retour" plutôt que "Entrée", de "retour chariot", qui était familier.

Neil Roy
la source
1

Pour ajouter à la confusion, j'ai travaillé sur un simple éditeur de texte utilisant un élément TextArea dans une page HTML dans un navigateur. En prévision de problèmes de compatibilité avec CR / LF, j'ai écrit le code pour vérifier la plate-forme et utiliser la convention de nouvelle ligne applicable à la plate-forme.

Cependant, j'ai découvert quelque chose d'intéressant lors de la vérification des caractères réels contenus dans TextArea, via une petite fonction JavaScript qui génère les données hexadécimales correspondant aux caractères.

Pour le test, j'ai tapé le texte suivant:

Bonjour, monde [entrer]

Au revoir, monde cruel [entrer]

Lorsque j'ai examiné les données textuelles, la séquence d'octets que j'ai obtenue était la suivante:

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

Maintenant, la plupart des gens qui regardent cela et voient 0a mais pas 0d octets penseraient que cette sortie a été obtenue sur une plate-forme Unix / Linux. Mais, voici le hic: cette séquence que j'ai obtenue dans Google Chrome sur Windows 7 64 bits.

Donc, si vous utilisez un élément TextArea et examinez le texte, VÉRIFIEZ la sortie comme je l'ai fait ci-dessus, pour vous assurer quels octets de caractères réels sont renvoyés de votre TextArea. Je n'ai pas encore vu si cela diffère sur d'autres plates-formes ou d'autres navigateurs, mais cela vaut la peine de garder à l'esprit si vous effectuez un traitement de texte via JavaScript, et vous devez rendre cette plate-forme de traitement de texte indépendante.

Les conventions couvertes dans les articles ci-dessus s'appliquent à la sortie de la console , mais les éléments HTML, semble-t-il, adhèrent à la convention UNIX / Linux. Sauf si quelqu'un découvre le contraire sur une autre plateforme / navigateur.

David Edwards
la source
0
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

Prenons cet exemple, essayez de mettre \ n à la place de \ r, cela ne fonctionnera pas et essayez de deviner pourquoi?

karthik gorijavolu
la source
1
Cela ne fonctionne que si votre système d'exploitation soulignant envoie \ r \ n lorsque vous appuyez sur la touche ENTRÉE, comme MS DOS, DECS TOPS-10, CP / M, RT-11, etc. Dans le système d'exploitation: es comme Multic, Unix et de type Unix ( Linux, Minix, etc.) BeOS, RISCOS, etc. La touche ENTER vous envoie uniquement un caractère \ n.
Anders
1
ahh oui le bon vieux temps où les claviers avaient les deux Returnet Enter. Même mon clavier sans fil moderne affiche toujours la flèche vers le bas et vers l'arrière sur l'ancienne Returnclé (qui est maintenant intitulée "Entrée" pour être cohérente avec la touche du clavier numérique Enter, qui n'affiche pas la flèche)
rien n'est nécessaire
0

Quelle est la différence entre \ n (nouvelle ligne) et \ r (retour chariot)?

En particulier, existe-t-il des différences pratiques entre \net \r? Y a-t-il des endroits où l'un devrait être utilisé au lieu de l'autre?


Je voudrais faire une courte expérience avec les séquences d'échappement respectives de \npour la nouvelle ligne et \rpour le retour chariot pour illustrer où la différence distincte entre elles est.

Je sais que cette question a été posée comme indépendante de la langue. Néanmoins, nous avons besoin d'une langue au moins pour réaliser l'expérience. Dans mon cas, j'ai choisi C ++, mais l'expérience sera généralement applicable dans n'importe quel langage de programmation.

Le programme itère simplement pour imprimer une phrase dans la console, fait par une itération for-loop.


Programme Newline:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

Production:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

Notez que ce résultat ne sera fourni sur aucun système, vous exécutez ce code C ++. Mais cela fonctionnera pour les systèmes les plus modernes. Lisez ci-dessous pour plus de détails.


Maintenant, le même programme, mais avec la différence, qui \nest remplacé par \rà la fin de la séquence d'impression.

Programme de retour de transport:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

Production:

7.Walkthrough of the for-loop 

Avez-vous remarqué la différence? La différence est simplement que lorsque vous utilisez la séquence d'échappement de retour chariot \rà la fin de chaque séquence d'impression, l'itération suivante de cette séquence n'entre pas dans la ligne de texte suivante - À la fin de chaque séquence d'impression, le curseur n'a pas sauté au * début de la ligne suivante.

Au lieu de cela, le curseur est revenu au début de la ligne, sur laquelle il se trouvait à la fin de, avant d'utiliser le \rcaractère. - Le résultat est que chaque itération suivante de la séquence d'impression remplace la précédente.

* Remarque: A \nne saute pas nécessairement au début de la ligne de texte suivante. Sur certains systèmes d'exploitation, généralement plus anciens, le résultat du \ncaractère de nouvelle ligne peut être qu'il saute n'importe où dans la ligne suivante, pas seulement au début. C'est pourquoi, ils doivent utiliser \r \npour obtenir au début de la prochaine ligne de texte.


Cette expérience nous a montré la différence entre la nouvelle ligne et le retour chariot dans le contexte de la sortie de l'itération d'une séquence d'impression.

Lorsque vous discutez de l' entrée dans un programme, certains terminaux / consoles peuvent convertir un retour chariot en nouvelle ligne implicitement pour une meilleure portabilité, compatibilité et intégrité.

Mais si vous avez le choix de choisir l'un pour l'autre ou si vous voulez ou devez utiliser explicitement un seul spécifique, vous devez toujours opérer avec celui qui correspond à son objectif et faire une distinction stricte.

RobertS soutient Monica Cellio
la source