Rappel - \ r \ n ou \ n \ r?


390

Je ne m'en souviens pas. Alors, quelle est la bonne façon de terminer correctement les anciennes lignes ASCII?


11
Si vous faites cela, assurez-vous d'ouvrir vos fichiers en mode binaire . Sinon, les flux de fichiers C / C ++ standard convertiront le "\ n" (pour les fichiers texte (par défaut)) en une séquence de fin de ligne spécifique à la plate-forme (ELS). Ainsi, "\ r \ n" sur Windows sera converti en "\ r \ r \ n" sur le disque physique. Remarque: si vous utilisez simplement C / C ++ pour lire le fichier, vous ne remarquerez pas que l'ELS sera reconverti en "\ n" lors de la lecture à partir du fichier.
Martin York

@Martin - Je suis en .net, et j'utilise (pour cet exemple) File.AppendAllText, avec "\ r \ n", et je viens de jeter un oeil dans un fichier, et il n'y a pas de duplication \ r à la fin de la ligne. La magie?
Daniel Mošmondor

@Daniel: J'aurais dû être plus précis. Les flux C / C ++ . Lorsqu'il est associé à un fichier et ouvert en mode texte . Cela dépend également de la façon dont vous regardez le fichier (utilisez un éditeur hexadécimal).
Martin York

@Martin - PSPad utilisé en mode hexadécimal ...
Daniel Mošmondor

1
Sur les claviers anciens, la touche Entrée était appelée la touche Retour. Le retour est donc venu en premier, puis le saut de ligne a été généré en réponse. C'est tellement évident quand vous avez beaucoup trop d'histoire.
Mark Ransom

Réponses:


1084

J'utiliserais le mot « r etur n » pour me souvenir, le r vient avant le n.


116
Et pour se souvenir que le mot à utiliser est retour , rappelez-vous que \ r est le retour chariot . Ne vous souvenez pas que "Retour" est le nom de la touche sur les claviers Mac, sinon vous pourriez regarder plus tard un clavier de PC, voir la touche appelée "Entrée" et vous trompez l'ordre des lettres!
Rob Kennedy

3
@David Mais je me demandais cet effet \n\ret \r\nest le même, n'est-ce pas le même effet? pouvez-vous faire la différence?
Mr.Anubis

7
@ Mr.Anubis si vous avez une certaine imprimante matricielle, il ne devrait y avoir AUCUNE différence, car l'ordre des commandes ne devrait pas être important. Cependant, sur certaines imprimantes, vous obtiendrez une ligne vide supplémentaire, ou pas d'avancement de ligne du tout. Et tout ce qui précède s'applique aux éditeurs de texte - ils seront confus, les classes TextStream tomberont malades, etc. L'ordre est important. :)
Daniel Mošmondor

12
@ DanielMošmondor Alternativement, vous pourriez juste vous rappeler que l'ordre est impoRtaNt. Ou que lorsque vous avez demandé à SO quelqu'un vous a donné un RemiNder, que vous avez oublié plus tard. Ou que vous ne pouvez pas utiliser votre nom de famille comme rappel, car l'ordre des r et n y est inversé :)
Daniel Daranas

5
@RobKennedy haha ​​vous savez que je suis venu ici et j'ai lu sur le retour, et j'ai pensé "génial!". J'ai ensuite lu votre commentaire. Maintenant, chaque fois que je ne me souviens plus de quelle touche je ne devrais pas regarder - je regarde ma touche "Entrée" et je pense que "quelque chose ne va vraiment pas ici" ...
Wayne Uroda

53

Si vous utilisez C #, vous devez utiliser Environment.NewLinece qui, selon MSDN, c'est:

Une chaîne contenant "\ r \ n" pour les plates-formes non Unix, ou une chaîne contenant "\ n" pour les plates-formes Unix.


46
En fait, cela dépend de ce que vous faites. Si vous ne faites que produire du texte brut sur la console ou dans un fichier pour une utilisation locale, ça Environment.NewLineva. Cependant, si vous écrivez des choses dans un format bien défini, le format peut également définir la nouvelle ligne. Par exemple, le protocole HTTP stipule que vous devez utiliser \r\ncomme terminateur de ligne pour les en-têtes, etc., quelle que soit la plate-forme.
Matti Virkkunen

3
Oui, c'est vraiment un mauvais conseil.
IvanP

C'est pourquoi vous devez échapper à vos messages Web et créer des tests unitaires pour vérifier que l'envoi \ r \ n (windows), \ r (mac), \ n (linux) envoie correctement en tant que \ r \ n au serveur Web.
TamusJRoyce

37

La nouvelle ligne dépend de votre système d'exploitation:

DOS & Windows: \r\n 0D0A (hex), 13,10 (decimal)
Unix & Mac OS X: \n, 0A, 10
Macintosh (OS 9): \r, 0D, 13

Plus de détails ici: https://ccrma.stanford.edu/~craig/utility/flip/

En cas de doute, utilisez n'importe quel visualiseur / éditeur hexadécimal gratuit pour voir comment un fichier code sa nouvelle ligne.

Pour moi, j'utilise le guide suivant pour m'aider à me souvenir: 0D0A = \ r \ n = CR, LF = ca rr iage r eturn, li n e feed


7
Curieusement, je fais partie de ces gens qui connaissent 0D0Apar cœur, mais qui confond toujours le \ret \n.
Nyerguds

1
Ou, je me souviens \ r est un retour chariot et \ n est un saut de ligne ... c'est juste que je ne me souviens pas de leur ordre, donc cela ne permet pas de se rappeler lequel est 0D et lequel est 0A;)
Nyerguds

20

La séquence est CR (retour chariot) - LF (saut de ligne). Vous vous souvenez des imprimantes matricielles? Exactement. Donc - l'ordre correct est \ r \ n


Je pense que c'est la réponse la plus logique
David Snabel-Caunt

12
LF + CR ferait le même CR + LF sur les imprimantes.
ikegami

10
Je ne suis pas d'accord, @David. Il ne suffit pas de penser aux imprimantes matricielles (ou aux machines à écrire, car ce sont elles qui ont un chariot à retourner). Avec seulement des informations de base sur leur fonctionnement, il n'y a aucune raison de penser que cela importe que nous avancions le papier avant ou après le retour au début de la ligne. \ R \ n et \ n \ r mettent le papier dans la même position.
Rob Kennedy

@ikegami sur la plupart des imprimantes, pas sur toutes. Ils avaient également des commutateurs DIP pour configurer ce comportement. :)
Daniel Mošmondor

5
Une des raisons pour mettre le saut de ligne après le retour du chariot est que cela réduit le temps total nécessaire - tandis que la tête revient sur le bord gauche du papier, la platine peut indexer une ligne. L'opération la plus longue commence en premier, de sorte que toute l'opération se termine dans le temps nécessaire à l'exécution de l'opération la plus longue. Nous avons fait beaucoup de choses pour des raisons comme ça à l'époque; imaginez attendre quelques centaines de lignes à 110 bauds ...
Jerry Andrews

8

Dans n'importe quelle langue .NET, Environment.NewLineserait préférable.


Ne fonctionne pas pour des chaînes constantes. Au besoin, mieux vaut ne pas utiliser de constante et utiliser à la place une chaîne statique;)
TamusJRoyce

5

Soyez prudent lorsque vous effectuez cette opération manuellement.
En fait, je conseillerais de ne pas le faire du tout.

En réalité, nous parlons de la séquence de terminaison de ligne LTS qui est spécifique à la plate-forme.

Si vous ouvrez un fichier en mode texte (c'est-à-dire non binaire), les flux convertiront le "\ n" en LTS correct pour votre plate-forme. Puis reconvertissez le LTS en "\ n" lorsque vous lisez le fichier.

Par conséquent, si vous imprimez "\ r \ n" dans un fichier Windows, vous obtiendrez la séquence "\ r \ r \ n" dans le fichier physique (regardez avec un éditeur hexadécimal).

Bien sûr, c'est une vraie douleur quand il s'agit de transférer des fichiers entre plates-formes.

Maintenant, si vous écrivez dans un flux réseau, je le ferais manuellement (comme la plupart des protocoles réseau l'appellent spécifiquement). Mais je m'assurerais que le flux ne fait aucune interprétation (donc le mode binaire était approprié).


4

\r\n pour Windows fera très bien l'affaire.


Un single \nfait très bien aussi sur Windows, y compris la dernière version du Bloc-notes.
André Caron

Je pense que les éditeurs modernes détecteront les fins de ligne, car différents systèmes d'exploitation utilisent différentes fins.
David Snabel-Caunt

1
En fait non: si vous imprimez ceci dans un fichier (fichier std C / C ++ ouvert en mode texte) sous Windows, le fichier physique contiendra "\ r \ r \ n" (vérifiez-le avec un éditeur hexadécimal). Lorsque vous le relisez, le "\ r \ n" est reconverti en un seul "\ n".
Martin York

2
En fait, @DavidCaunt, je viens d'essayer \ n et cela ne fonctionne pas avec le bloc-notes sur Win8.
philk

4

Sur Wikipedia (vous pouvez lire ce qui est correct pour votre système d'exploitation dans cet article):

Les systèmes basés sur ASCII ou un jeu de caractères compatible utilisent individuellement LF (saut de ligne, '\ n', 0x0A, 10 en décimal) ou CR (retour chariot, '\ r', 0x0D, 13 en décimal), ou CR suivi de LF (CR + LF, '\ r \ n', 0x0D0A).


3

\r\n

Bizarre de dire que je m'en souviens car c'est le contraire de la machine à écrire que j'ai utilisée.
Et bien si c'était normal je n'avais pas besoin de m'en souvenir ...:-)

machine à écrire de wikipedia * Image de Wikipedia

Dans la machine à écrire lorsque vous avez terminé de numériser la ligne, vous utilisez le levier de retour du chariot , qui avant fait rouler le tambour, le retour à la ligne et vous permet ensuite d'opérer manuellement le retour du chariot .

Vous pouvez écouter à partir de cet enregistrement de freesound.org le son de l'alimentation du papier au début, et à environ -1: 03 secondes après la fin, après l'avertissement de cloche pour la fin de la ligne sonore du tambour qui roule et après celui du retour chariot.


2

si vous utilisez C #, pourquoi ne pas utiliser Environment.NewLine? (Je suppose que vous utilisez des objets d'écrivain de fichiers ... passez-le simplement Environment.NewLineet il gérera les bons terminateurs.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.