Comment \ n et \ r sont-ils traités différemment sous Linux et Windows?

22

Je pense que \ndéplace l'aiguille vers le bas et \rdéplace l'aiguille au début d'une ligne (alignement à gauche)? Je ne suis pas sûr, cependant. Donc, si je me trompe, corrigez-moi ...

Quoi qu'il en soit, on m'a dit que Windows et Linux gèrent newlineset carriage returnsdifféremment. Je voudrais savoir comment ils les traitent différemment et certains endroits où il est important de se souvenir. Merci de répondre.

千里 ち ゃ ん
la source
Jusqu'à présent, je sais que \r\nc'est correct dans Windows mais ce \n\rn'est pas le cas, et je m'en souviens parce que \r\nc'est un acronyme pour infirmière autorisée. J'entends également que \nc'est ce que les gens utilisent sous Linux et \rn'est pas utilisé seul dans le même but que \r\n. \rest utilisé dans un MacOS vraiment ancien. Je n'ai cependant pas vérifié ces faits.
千里 ち ゃ ん
4
Ne les appelez pas \ret \n, puisque la façon dont cela \nest géré dépend de l'endroit où vous l'utilisez. Mieux vaut les appeler CRet LF.
Ignacio Vazquez-Abrams le
Ignacio, ces acronymes n'ont aucun sens pour moi. Comment appelles-tu ceci :/? OH ... AVANCE DE LIGNE et RETOUR DE CHARIOT. Merci, sleske.
千里 ち ゃ ん
@ IgnacioVazquez-Abrams \ n n'est-il pas identique à LF? Sur n'importe quel graphique ASCII, le caractère 13 = \ n = LF n'est-il pas?
barlop
1
@barlop: Pas en C lors de la sortie sous Windows.
Ignacio Vazquez-Abrams

Réponses:

21

Je pense que \ n déplace l'aiguille vers le bas et \ r déplace l'aiguille au début d'une ligne (alignement à gauche)? Je ne suis pas sûr, cependant

C'est vrai, plus ou moins, mais surtout une curiosité historique. À l'origine, le saut de ligne (LF) était utilisé pour faire avancer le papier d'une ligne sur les imprimantes et les terminaux papier ( téléimprimeurs ); le retour chariot (CR) a renvoyé la tête d'impression au début de la ligne.

Cela fonctionne probablement toujours sur les imprimantes modernes lorsqu'il est utilisé en "mode texte", mais il est autrement peu pertinent aujourd'hui.

Quoi qu'il en soit, on m'a dit que Windows et Linux gèrent différemment les retours à la ligne et les retours chariot.

La différence est simple: les concepteurs de systèmes d'exploitation devaient choisir comment représenter le début d'une nouvelle ligne de texte dans des fichiers informatiques. Pour diverses raisons historiques, dans le monde Unix / Linux, un seul caractère LF a été choisi comme marqueur de nouvelle ligne; MS-DOS a choisi CR + LF, et Windows en a hérité. Ainsi, différentes plates-formes utilisent différentes conventions.

En pratique, cela devient de moins en moins un problème. Le marqueur de nouvelle ligne n'est vraiment pertinent que pour les programmes qui traitent du "texte brut", et il n'y en a pas beaucoup - il affecte principalement uniquement le code source du programme, les fichiers de configuration et certains fichiers texte simples avec documentation. De nos jours, la plupart des programmes gérant ces types de fichiers (éditeurs, compilateurs, etc.) peuvent gérer les deux conventions de nouvelle ligne, donc peu importe celle que vous choisissez.

Dans certains cas, les outils insistent sur "leur" convention de nouvelle ligne (par exemple, les scripts shell Unix ne doivent pas utiliser CR + LF), auquel cas vous devez utiliser la bonne.

sleske
la source
Même questionnement: les langages de programmation reconnaissent-ils \n\ret \nsont-ils les mêmes? Par exemple, si j'analysais un fichier texte qui a été modifié sur le PC de quelqu'un d'autre et qui contenait à la fois la version Linux et Windows des sauts de ligne, effectuer un preg_matchfor \net \n\rme donner des résultats différents?
千里 ち ゃ ん
@ 千里 ち ゃ ん: Cela dépend totalement du langage de programmation, du compilateur, etc. Je crois).
sleske
@ 千里 ち ゃ ん: Si vous avez une question sur la façon dont un système / langage de programmation / moteur d'expression régulière gère différentes conventions de nouvelle ligne, posez-le simplement comme une question distincte.
sleske
vous devriez écrire \ r \ n pas dans le mauvais sens comme vous l'êtes. Quant aux langages de programmation, ils seraient capables de lire des caractères individuels et vous, le programmeur, pouvez voir ce qui est utilisé dans l'entrée, et vous le programmeur pouvez également faire ce que vous souhaitez pour la sortie. Tout comme vous pourriez dire "Ecrivez ABC suivi de \ r \ r \ r \ n" quels que soient les caractères que vous souhaitez coller à la fin! certains autres caractères peuvent être non imprimables et non graphiques ou autres. Ils peuvent avoir des fonctions intégrées comme println, et ce qu'ils utilisent pour leur nouvelle ligne serait l'un ou l'autre, ce ne peut pas être les deux.
barlop
@ 千里 ち ゃ ん et certains langages de programmation peuvent vous permettre de choisir quel lnie se terminant comme paramètre dans l'une de leurs fonctions intégrées, donc même dans une fonction intégrée, vous pourriez .. en théorie de toute façon. + comme mentionné, en pratique, vous pouvez écrire la fin de ligne que vous voulez ... bien que vous ne puissiez pas le faire efficacement comme avec une fonction println.
barlop
14

CR et LF

L'American Standard Code for Information Interchange (ASCII) définit les caractères de contrôle, y compris CARRIAGE-RETURN (CR) et LINE-FEED (LF) qui étaient (et sont toujours) utilisés pour contrôler la position d'impression sur les imprimantes d'une manière analogue à la machines à écrire mécaniques qui ont précédé les premières imprimantes informatiques.

Dépendance à la plateforme

Sous Windows, le séparateur de ligne traditionnel dans les fichiers texte est CR suivi de LF

Dans les anciens systèmes Apple Macintosh (antérieurs à OSX), le séparateur de ligne traditionnel dans les fichiers texte était CR

Sous Unix et Linux, le séparateur de ligne traditionnel dans les fichiers texte est LF.

\ n et \ r

Dans de nombreux langages de programmation et de script \nsignifie «nouvelle ligne». Parfois (mais pas toujours), cela signifie le caractère ASCII LINE-FEED (LF), qui, comme vous le dites, déplace le curseur (ou la position d'impression) d'une ligne vers le bas. Dans une imprimante ou une machine à écrire, cela déplacerait le papier d'une ligne.

Invariablement \rsignifie le caractère ASCII CARRIAGE-RETURN (CR) dont le nom provient en fait de machines à écrire mécaniques où il y avait une touche de retour chariot qui a fait déplacer le rouleau ("chariot") qui portait le papier vers la droite, alimenté par un ressort, aussi loin que cela irait. Définissant ainsi la position de frappe actuelle sur la marge gauche.

Programmation

Dans certains langages de programmation, cela \npeut signifier une séquence de caractères dépendante de la plate-forme qui termine ou sépare des lignes dans un fichier texte. Par exemple, en Perl, print "\n"produit une séquence de caractères différente sur Linux que sur Windows.

En Java, la meilleure pratique, si vous souhaitez utiliser les fins de ligne natives pour la plate-forme d'exécution, est de ne pas les utiliser \nou pas \rdu tout. Vous devez utiliser System.getProperty("line.separator"). Vous devez utiliser \net \roù vous voulez LF et CR indépendamment de la plate-forme (par exemple, comme utilisé dans HTTP, FTP et autres protocoles de communication Internet).

Unix stty

Dans un shell Unix, la sttycommande peut être utilisée pour faire traduire le shell entre ces différentes conventions. Par exemple stty -onlcr, le shell traduira par la suite tous les LF sortants en CR LF.

Linux et OSX suivent les conventions Unix

Fichiers texte

Les fichiers texte sont toujours extrêmement importants et largement utilisés. Par exemple, HTML et XML sont des exemples de fichier texte. La plupart des protocoles Internet importants, tels que HTTP, suivent les conventions des fichiers texte et incluent des spécifications pour les fins de ligne.

Imprimantes

La plupart des imprimantes autres que les moins chères respectent toujours CR et LF. En fait, ils sont fondamentaux pour les langages de description de page les plus utilisés - PCL et Postscript.

RedGrittyBrick
la source
1
Remarque sur Java: il n'est généralement pas vrai que vous ne devez "pas utiliser du tout \ n ou \ r". C'est juste qu'en Java, "\ n" est toujours LF et "\ r" est toujours CR. Cela peut être exactement ce que vous voulez: si vous voulez un style de fin de ligne spécifique, utilisez-les; si vous voulez explicitement la ligne native fin de l'ordinateur que vous utilisez, puis utiliser line.separator. Cela dépend vraiment de ce que vous voulez.
sleske
Et BTW, println()utilise automatiquement line.separator, donc si vous voulez des fins de ligne natives, vous pouvez utiliser println()(et si vous avez besoin d'un certain type spécifique de fin de ligne, alors ne l'utilisez pas, mais utilisez "\ n" etc. explicitement).
sleske
@sleske: Bons points. Je mettrai à jour ma réponse en conséquence.
RedGrittyBrick
1
Existe-t-il des langages ou des compilateurs où \nexiste un caractère de contrôle autre que ASCII LF (autre que les systèmes basés sur EBCDIC)? Je fais référence à ce que \nsignifie un littéral de chaîne ou de caractère, pas à l'effet de l'envoyer à un fichier ou à un périphérique de sortie.
Keith Thompson
1
@KeithThompson: Pour Java: Oui, \nest toujours le code ASCII (et Unicode) 10, car le JLS le dit explicitement (JLS 3.10.6, "Séquences d'échappement pour les littéraux de caractères et de chaînes" - j'ai vérifié :-)). Pour les autres langues - bonne question.
sleske
4

Bref, c'était nécessaire pour les imprimantes, mais maintenant les OS le font légèrement différemment. Dans la plupart des cas, il est correct de faire à la fois CR et LF en faisant \r\net dans la plupart des cas, cela fonctionnera bien.

James Billingham
la source
Linux ignore-t-il simplement le \rou provoque-t-il une sorte de changement de comportement?
Aaron Franke