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é au lieu de l'autre?
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é au lieu de l'autre?
Réponses:
En termes de code ascii, c'est 3 - car ils sont respectivement 10 et 13 ;-).
Mais sérieusement, il y en a beaucoup:
\n
est le code de fin de ligne, \r
ne signifie rien de spécial\n
est 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)\r
était le code de fin de ligne à la place\r\n
, dans cet ordre\r\n
est la terminaison de ligne standard pour les formats de texte sur Internet\r
commande au chariot de reculer vers la gauche jusqu'à ce qu'il atteigne l'arrêt le plus à gauche (une opération lente), \n
commande 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 .\r
et \n
agissent 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 \r
est 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 ;-).
\0
) ont été ajoutés après le \n
pour 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é.
\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 \n
ou \r
sont visibles dans le sens que , par exemple a
, .
, (
etc. personnages sont.
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.
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
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.
\r
n'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), \n
est maintenant utilisé.
\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 \r
terminaisons -line.
É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\n
origine 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.
Deux personnages différents pour différents systèmes d'exploitation. Cela joue également un rôle dans les données transmises TCP/IP
qui nécessitent l'utilisation de\r\n
.
\n
Unix
\r
Mac
\r\n
Windows et DOS.
Compléter,
Dans un script shell (bash), vous pouvez utiliser \r
pour envoyer le curseur, devant en 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"
AA--AA
AA--AABB
BB--AABB
Mais n'oubliez pas d'utiliser -en
comme paramètres.
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.
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.
#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?
Return
et Enter
. Même mon clavier sans fil moderne affiche toujours la flèche vers le bas et vers l'arrière sur l'ancienne Return
clé (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)
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é au lieu de l'autre?
Je voudrais faire une courte expérience avec les séquences d'échappement respectives de \n
pour la nouvelle ligne et \r
pour 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 \n
est 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 \r
caractère. - Le résultat est que chaque itération suivante de la séquence d'impression remplace la précédente.
* Remarque: A \n
ne 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 \n
caractè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 \n
pour 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.