311 votes

Quelle est la différence entre \r et \n ?

Comment sont et différents ? Je pense qu’il a quelque chose à voir avec Unix vs Windows vs Mac, mais je ne sais pas exactement comment ils sont différents et pour chercher / match en regexes.

472voto

Jon Skeet Points 692016

Ils sont différents personnages. \r est un retour chariot, et \n de saut de ligne est.

Sur les "anciens" des imprimantes, \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 des \n comme un séparateur de ligne; Windows a tendance à utiliser des \r\n comme un séparateur de ligne et Mac (OS 9) utilisé pour utiliser \r comme le séparateur de ligne. (Mac OS X est Unix-y, utilise \n , au lieu; il peut y avoir une certaine compatibilité des situations où l' \r est utilisé à la place.)

Pour plus d'informations, consultez le Wikipedia de retour à la ligne article.

EDIT: C'est la langue-sensibles. En C# et en Java, par exemple, \n toujours moyen 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.

110voto

Adrian McCarthy Points 17018

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:

  1. déplacer la tête d'impression de revenir au début de la ligne, puis
  2. le déplacer vers la ligne suivante.

ASCII code pour ces actions comme deux distincts des caractères de contrôle:

  • 0x0D (CR) déplace la tête d'impression de revenir au début de la ligne. (En Unicode, CR U+000D CARRIAGE RETURN.)
  • 0x0A (LF) déplace la tête d'impression vers le bas à la ligne suivante. (En Unicode, LF est U+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:

  • Variantes d'Unix (y compris les versions modernes de Mac) utiliser juste un LF caractère pour indiquer un retour à la ligne.
  • Ancienne (pré-OSX) des fichiers Macintosh utilisé seulement un caractère CR pour indiquer un retour à la ligne.
  • VMS, CP/M, ms-DOS, Windows, et de nombreux protocoles réseau s'attendent toujours à la fois: CR / LF.
  • Vieux IBM systèmes EBCDIC standardisés sur NL--un personnage qui n'existe même pas dans le jeu de caractères ASCII. En Unicode, NL est - U+0085 NEXT LINE, mais les EBCDIC valeur est 0x15.

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 des normes, il y a plusieurs façons de représenter les sauts de ligne. Bien que très rare à l'état sauvage, Unicode a de 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 de bip
  • \f (pour l'alimentation) qui se déplace vers le début de la page suivante
  • \t (tab) qui déplace la tête d'impression pour la prochaine tabulation horizontale position

(Cette liste est volontairement incomplète.)

Cette cartographie se passe au moment de la compilation--le compilateur voit \a et met quelle que soit la magie de valeur est utilisé pour sonner la cloche.

Notez que la plupart de ces mnémoniques ont des corrélations directes aux codes de contrôle ASCII. Par exemple, \a serait mapper 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é!

Enfin, 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 moment de l'exécution de la 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é au moment de la compilation d'une application définie par la valeur du caractère qui (en mode texte) est alors mappé à nouveau au 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, ce 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).

Cette 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 dira qu' \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), alors \n sera 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 de/à 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 une valeur magique qui pourrait ne 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.

11voto

NoMoreZealots Points 2539
<ul> <li>« \r » => retour</li> <li><p>« \n » => saut de ligne ou de saut de ligne (sémantique)</p></li> <li><p>Les systèmes basés sur Unix utilisent juste un « \n » pour mettre fin à une ligne de texte.</p></li> <li>Dos utilise « \r\n » à la fin une ligne de texte.</li> <li>Quelques autres machines utilisées juste un « \r ». (Apple II, commodore Mac OS avant d’OS X, etc...)</li> </ul>

5voto

Josip Medved Points 2307

En bref, \r a valeur ASCII 13 (CR) et \n a valeur ASCII 10 (LF). Mac utilise CR comme délimiteur de ligne (au moins, il l’a fait avant, je ne sais pas pour les macs modernes), * nix utilise LF et Windows utilise les deux (CRLF).

3voto

Greg Points 132247

En plus de la réponse de @Jon Skeet :

Traditionnellement, Windows utilise \r\n, de \n Unix et de Mac \r, cependant les Macs récents utilisent \n comme ils unix basé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X