Quelle est la différence entre \r et \n?
Comment sont \r
et \n
différents? Je pense qu'il a quelque chose à voir avec Unix et Windows vs Mac, mais je ne suis pas sûr exactement comment ils sont différents, et qui à la recherche pour/match en regexes.
- Ce besoin d'une balise de langue. Dans des langues différentes interprétations différentes de
'\n'
.
Vous devez vous connecter pour publier un commentaire.
Ils sont différents personnages.
\r
est un retour chariot, et\n
de saut de ligne est.Sur les "anciens" des imprimantes, des
\r
envoyé la tête d'impression de revenir au début de la ligne, et\n
avancé le papier d'une ligne. Les deux ont donc été nécessaires pour lancer l'impression sur la ligne suivante.Évidemment c'est un peu hors de propos maintenant, bien en fonction de la console, vous pouvez toujours être en mesure d'utiliser
\r
pour passer au début de la ligne et de remplacer le texte existant.Plus important encore, Unix, a tendance à utiliser
\n
comme un séparateur de ligne; Windows a tendance à utiliser\r\n
comme un séparateur de ligne et Mac (jusqu'à OS 9) utilisé à utiliser\r
que le séparateur de ligne. (Mac OS X est Unix-y, utilise donc\n
à la place; il peut y avoir une certaine compatibilité des situations où\r
est utilisé à la place si.)Pour plus d'informations, voir la Wikipédia retour à la ligne de l'article.
EDIT: C'est la langue-sensibles. En C# et en Java, par exemple,
\n
toujours signifie Unicode U+000A, qui est définie comme la ligne d'alimentation. En C et C++, l'eau est un peu boueux, que le sens est spécifique à la plateforme. Voir les commentaires pour plus de détails.\n
n'est pas nécessairement l'ASCII caractère de saut de ligne. C'est un C et C++ convention pour la référence de l'accueil de la plate-forme de séparateur de ligne lorsque vous effectuez I/O en mode texte. La plupart des implémentations arrive d'utiliser de l'ASCII caractère de saut de ligne pour\n
, mais je ne pense pas que le C ou le C++ normes requièrent que. Si vous voulez une nouvelle ligne, vous utilisez\n
. Si vous souhaitez un saut de ligne, vous utilisez\x0A
. En revanche\r
est censé être le code ASCII du caractère retour chariot, indépendamment de la mise en œuvre.\n
est la garantie d'être de retour à la ligne (section 2.4.4.4). Bien sûr, ce serait bien si l'OP a précisé la plate-forme... d'Ailleurs, je pense que ce niveau de détail serait plus à confusion qu'utile pour quelqu'un simplement en demandant à la différence.U+000A LINE FEED
(mais alors il appelle "Saut de ligne" qui semble prêter à confusion commeU+0085 NEXT LINE
). Dans de nombreux autres contextes, (comme le C et C++)\r
est un personnage et\n
est un espace réservé pour le concept de "passer à la ligne suivante". Je pense que le raccourci par l'amalgame entre la commune de mise en œuvre (ancrage avec un saut de ligne) avec la "nouvelle ligne" concept conduit à des malentendus et à des bugs.\n
est particulière en ce sens qu'il est un exécution étape de traduction pour convertir vers/à partir de l'hôte de la plate-forme de saut de ligne séquence en mode texte. Que fait\n
nettement différente de\r
(et tous les autres barre oblique inverse des séquences).\n
de saut de ligne est.En C et C++,
\n
est un concept,\r
est un personnage, et\r\n
est (presque toujours) une portabilité bug.Penser à un vieil téléscripteur. La tête d'impression est positionné sur une ligne et en colonne. Lorsque vous envoyez un caractère imprimable pour le télétype, il imprime le caractère à la position actuelle et se déplace la tête de la colonne suivante. (Ce qui est théoriquement le même comme une machine à écrire, sauf que les machines à écrire généralement déplacé le papier à l'égard de la tête d'impression.)
Lorsque vous voulez terminer la ligne en cours et démarrer sur la ligne suivante, il y avait à faire en deux étapes:
ASCII code pour ces actions comme deux distincts des caractères de contrôle:
\x0D
(CR) déplace la tête d'impression de revenir au début de la ligne. (Unicode code pour ce queU+000D CARRIAGE RETURN
.)\x0A
(LF) déplace la tête d'impression vers le bas à la ligne suivante. (Unicode code pour ce queU+000A LINE FEED
.)Dans les jours de télétypes et le début de la technologie des imprimantes, des personnes ont profité du fait que ce sont deux opérations distinctes. Par l'envoi d'un CR sans le suivant par un LF, vous pouvez imprimer sur la ligne que vous avez déjà imprimé. Cela a permis d'effets, comme les accents, les caractères gras et soulignés. Certains systèmes de surimpression à plusieurs reprises pour empêcher les mots de passe d'être visible dans la version papier. Sur les débuts de série CRT bornes, CR a été l'un des moyens de contrôler la position du curseur afin de mettre à jour le texte déjà sur l'écran.
Mais la plupart du temps, vous avez en fait je voulais juste aller à la ligne suivante. Plutôt que d'exiger la paire de caractères de contrôle, certains systèmes de permis de juste l'un ou l'autre. Par exemple:
U+0085 NEXT LINE
, mais les EBCDIC valeur est0x15
.Pourquoi les différents systèmes de choisir différentes méthodes? Tout simplement parce qu'il n'y a pas de norme universelle. Où votre clavier probablement dit: "Entrez", des claviers anciens habitude de dire: "Retour", qui a été courte pour le Transport de Retour. En fait, sur un terminal série, en appuyant sur Retour envoie le caractère CR. Si vous écriviez un éditeur de texte, il serait tentant d'utiliser ce personnage comme il est venu dans le terminal. Peut-être que c'est pourquoi les anciens Mac utilisé juste CR.
Maintenant que nous avons normes, il y a plus façons de représenter les sauts de ligne. Bien que très rare à l'état sauvage, Unicode a des nouveaux personnages comme:
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
Avant même d'Unicode est venu le long, des programmeurs voulais moyens simples pour représenter les plus utiles des codes de contrôle, sans se soucier de la sous-jacentes jeu de caractères. C a plusieurs séquences d'échappement pour la représentation des codes de contrôle:
\a
(d'alerte) qui sonne le téléscripteur de bell ou le terminal bip\f
(pour l'alimentation) qui se déplace vers le début de la page suivante\t
(par onglet) qui déplace la tête d'impression pour la prochaine tabulation horizontale position(Cette liste est volontairement incomplète.)
Cette cartographie arrive à au moment de la compilation--le compilateur voit
\a
et met quelle que soit la magie de valeur est utilisé pour sonner la cloche.Avis que la plupart de ces mnémoniques ont des corrélations directes aux codes de contrôle ASCII. Par exemple,
\a
serait carte à0x07 BEL
. Un compilateur qui pourrait être écrit pour un système utilisé autre chose que de l'ASCII pour l'hôte jeu de caractères (par exemple, EBCDIC). La plupart des codes de contrôle qui avait des mnémoniques pourrait être mappés à des codes de contrôle dans d'autres jeux de caractères.Huzzah! La portabilité!
Ou presque. En C, je pourrais écrire
printf("\aHello, World!");
qui sonne la cloche (ou bip) et les sorties d'un message. Mais si je voulais de l'imprimer quelque chose sur la ligne suivante, j'avais encore besoin de savoir ce que la plate-forme hôte nécessite de passer à la prochaine ligne de sortie. CR LF? CR? LF? NL? Quelque chose d'autre? Tant pour des raisons de portabilité.C dispose de deux modes pour I/O: le binaire et le texte. En mode binaire, toutes les données envoyées est transmise en tant que-est. Mais en mode texte, il y a un au moment de l'exécution traduction qui convertit un caractère spécial pour quelle que soit la plate-forme hôte besoins pour une nouvelle ligne (et vice versa).
Grande, alors, quel est le caractère spécial?
Eh bien, c'est dépendant de l'implémentation, trop, mais il y a une mise en œuvre indépendante de préciser:
\n
. Il est généralement appelé le "caractère de saut de ligne".C'est un subtil mais important:
\n
est mappé à moment de la compilation à un de mise en œuvre définies par la valeur du caractère qui (en mode texte) est alors mappé à nouveau à moment de l'exécution pour le personnage (ou une séquence de caractères) requis par la plateforme sous-jacente à passer à la ligne suivante.\n
est différent de tous les autres anti-slash littéraux parce qu'il y a deux démarches impliquées. Cette étape de la cartographie fait\n
significativement différentes de celles de même\r
, qui est tout simplement une compilation de mappage CR (ou les plus similaires code de contrôle quel que soit le sous-jacent le jeu de caractères).Ce voyages beaucoup de C et C++ pour les programmeurs. Si on faisait un sondage auprès de 100 d'entre eux, au moins 99 vous dire que
\n
moyens de saut de ligne. Ce n'est pas tout à fait vrai. La plupart (sinon tous) de C et de C++ implémentations utilisent LF comme la magie de la valeur intermédiaire pour\n
, mais c'est un détail d'implémentation. Il est possible pour un compilateur d'utiliser une valeur différente. En fait, si l'hôte jeu de caractères n'est pas un sur-ensemble de l'ASCII (par exemple, si c'est EBCDIC), puis\n
aurez presque certainement pas être LF.Donc, en C et C++:
\r
est littéralement un retour chariot.\n
est une valeur magique qui se traduit (en mode texte) à au moment de l'exécution/à partir de l'hôte de la plate-forme de saut de ligne de la sémantique.\r\n
est presque toujours une portabilité bug. En mode texte, cela se traduit pour CR suivie par la plate-forme de saut de ligne séquence--probablement pas ce qu'on veut. En mode binaire, cela se traduit pour CR suivie par la magie de la valeur que peut pas être LF-peut-être pas ce qu'on veut.\x0A
est le plus portable de façon à indiquer un ASCII LF, mais vous ne voulez faire qu'en mode binaire. La plupart en mode texte les implémentations de la traiter comme\n
."\n" => retour chariot ou Saut de ligne
(sémantique)
Unix, utilisez simplement un "\n" à la fin d'une ligne de texte.
En bref \r a valeur ASCII 13 (CR) et \n a la valeur ASCII 10 (LF).
Mac utilise des CR comme délimiteur de ligne (au moins, il a fait avant, je ne suis pas sûr pour mac moderne), *nix utilise LF et Windows utilise les deux (CRLF).
\r
est utilisé pour pointer vers le début d'une ligne et peut remplacer le texte à partir de là, par exemple,Produit de cette sortie:
\n
est pour la nouvelle ligne.En plus de @Jon Skeet réponse:
Traditionnellement Windows a utilisé \r\n, Unix \n et Mac \r cependant plus récents utilisent de Mac \n comme ils sont basés sur unix.
en C#, j'ai trouvé qu'ils utilisent \r\n dans une chaîne de caractères.
\r Retour Chariot; \n Nouvelle Ligne (Line Feed) ... dépend de l'OS à ce que chaque moyen. Lire ce l'article pour en savoir plus sur la différence entre '\n' et '\r\n' ... en C.
\r utilisés pour le transport de retour. (Valeur ASCII 13)
\n utilisé pour la nouvelle ligne. (Valeur ASCII 10)