web-dev-qa-db-fra.com

Différence entre\n et\r?

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

En particulier, existe-t-il des différences pratiques entre \n et \r? Y a-t-il des endroits où l'un devrait être utilisé à la place de l'autre?

485
3zzy

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

Mais sérieusement, il y en a beaucoup:

  • sous Unix et tous les systèmes de type Unix, \n est le code pour la fin de ligne, \r ne signifie rien de spécial
  • par conséquent, en C et dans la plupart des langages qui le copient (même à distance), \n est la séquence d'échappement standard pour la fin de ligne (traduite en/à partir de séquences spécifiques au système d'exploitation, si nécessaire).
  • dans les anciens systèmes Mac (avant OS X), \r était le code de fin de ligne
  • sous Windows (et de nombreux anciens systèmes d’exploitation), le code de fin de ligne est composé de 2 caractères, \r\n, dans cet ordre
  • conséquence (surprenante ;-) (rappel des systèmes beaucoup plus anciens que Windows), \r\n est la terminaison de ligne standard des formats de texte sur Internet.
  • pour les "terminaux" de type télétype électromécaniques, \r commande au chariot de revenir à gauche jusqu'à ce qu'il atteigne la butée la plus à gauche (opération lente), \n commande au rouleau de remonter une ligne (beaucoup plus rapidement) opération) - c’est la raison pour laquelle vous avez toujours \r avant \n, de sorte que le rouleau puisse se déplacer lorsque le chariot est en marche. toujours aller à gauche! -) Wikipedia a un explication plus détaillée .
  • pour les terminaux en mode caractère (émulant généralement les impressions les plus anciennes comme ci-dessus), en mode brut, \r et \n agissent de la même manière (sauf à la fois en termes de curseur, car est pas de chariot ni de rouleau ;-)

En pratique, dans le contexte moderne d’écriture dans un fichier texte, vous devez toujours utiliser \n (le moteur d’exécution sous-jacent le traduira si vous utilisez un système d’exploitation étrange, par exemple Windows ;-). La seule raison d'utiliser \r est si vous écrivez sur un terminal de personnage (ou plus vraisemblablement une "fenêtre de console" l'émulant) et que vous voulez que la ligne suivante que vous écrivez remplace la dernière que vous venez d'écrire (parfois utilisée). pour les effets "d'animation ascii" loufoques, par exemple des barres de progression) - cela devient plutôt obsolète dans un monde d'interfaces utilisateur graphiques ;-).

749
Alex Martelli

Historiquement, \n était utilisé pour déplacer le chariot vers le bas, alors que \r était utilisé pour déplacer le chariot vers la gauche de la page.

108
tster

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.

27
pavium

Étant donné que personne d’autre n’en a parlé spécifiquement (sont-ils trop jeunes pour le savoir/s’en souvenir?), J’imagine que l’utilisation de \r\n était destinée aux machines à écrire et aux appareils similaires.

Lorsque vous vouliez créer une nouvelle ligne en utilisant une machine à écrire multi-lignes, il fallait exécuter deux actions physiques: faire glisser le chariot vers le début (à gauche, en US) de la page et avancer le papier d'un cran .

À l'époque des imprimeurs linéaires, par exemple, le seul moyen de créer du texte en gras était de faire un retour à la ligne SANS une nouvelle ligne et d'imprimer les mêmes caractères par-dessus les anciens, en ajoutant ainsi plus d'encre, ce qui le rendait plus foncé (en gras). . Lorsque la fonction mécanique "nouvelle ligne" a échoué dans une machine à écrire, le résultat était gênant: vous pouviez taper sur la ligne de texte précédente si vous ne faisiez pas attention.

19
nothingisnecessary

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

\n Unix

\r Mac

\r\n Windows et DOS.

11
a432511

Compléter,

Dans un script Shell (bash), vous pouvez utiliser \r pour envoyer le curseur devant la ligne et, bien sûr, \n pour placer le curseur sur une nouvelle ligne.

Par exemple, essayez:

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • Le premier "echo" display AA--AA
  • La seconde: AA--AABB
  • Le dernier: BB--AABB

Mais n'oubliez pas d'utiliser -en en tant que paramètres.

7
Akarun

Dans les fenêtres, le\n se déplace au début de la ligne suivante. Le\r se déplace au début de la ligne en cours, sans passer à la ligne suivante. J'ai utilisé\r dans mes propres applications de console où je teste du code et que je ne veux pas voir le texte défiler sur mon écran. Par conséquent, plutôt que d'utiliser\n après avoir imprimé du texte, par exemple une fréquence d'images FPS), je vais printf ("% - 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 à l’écran qui ne seront pas défilées pendant que le débit d’image est mis à jour constamment sur la même ligne (le% -10 certain que la sortie est au moins 10 caractères, justifiée à gauche pour finir par être complétée par des espaces, en écrasant les anciennes valeurs de cette ligne). C'est assez pratique pour des choses comme celle-ci, généralement lorsque j'ai des sorties de débogage sur l'écran de la console.

Un peu d'histoire

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

Le/n signifie "nouvelle ligne", encore une fois, à partir des jours de machine à écrire, vous êtes passé à une nouvelle ligne. Cependant, ce n’est pas vraiment au début, c’est pourquoi certains systèmes d’exploitation ont adopté la nécessité d’un retour à la ligne suivi d’un retour à la ligne, car c’était là la commande dans laquelle une machine à écrire l’a fait. Cela explique aussi les vieux ordinateurs 8 bits avoir "Retour" plutôt que "Entrée", de "retour chariot", qui était familier.

3
Neil Roy

Juste pour ajouter à la confusion, je travaille sur un éditeur de texte simple utilisant un élément TextArea dans une page HTML dans un navigateur. En prévision des problèmes de compatibilité liés à CR/LF, j'ai écrit le code pour vérifier la plate-forme et utiliser la convention newline qui était 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 générant les données hexadécimales correspondant aux caractères.

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

Bonjour le monde [entrez]

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 ceci, et voyant 0a mais pas 0d octets, penseraient que cette sortie a été obtenue sur une plate-forme Unix/Linux. Mais voici le problème: cette séquence que j'ai obtenue dans Google Chrome sous Windows 7 64 bits.

Ainsi, si vous utilisez un élément TextArea et examinez le texte, VÉRIFIEZ la sortie comme précédemment, pour vous assurer que les octets de caractères réels sont renvoyés par votre TextArea. Je n'ai pas encore déterminé si cela diffère sur d'autres plates-formes ou sur d'autres navigateurs, mais il convient de garder à l'esprit si vous effectuez un traitement de texte via JavaScript et que vous devez rendre cette plate-forme de traitement de texte indépendante.

Les conventions décrites dans les articles ci-dessus s'appliquent à la sortie de 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 plate-forme/navigateur.

0
David Edwards
#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 d'essayer de deviner pourquoi?

0
karthik gorijavolu