Come sono gestiti \ n e \ r in modo diverso su Linux e Windows?


22

Penso che \nsposta l'ago verso il basso e \rsposta l'ago all'inizio di una linea (allineamento a sinistra)? Non sono sicuro, però. Quindi, se sbaglio, correggimi ....

Comunque, mi è stato detto che Windows e Linux gestiscono newlinese in modo carriage returnsdiverso. Vorrei sapere come li gestiscono in modo diverso e in alcuni luoghi in cui è importante ricordare. Grazie per aver risposto.


Finora so che \r\nva bene in Windows ma \n\rnon lo è, e lo ricordo perché \r\nè l'acronimo di un'infermiera registrata. Ho anche sentito che \nè quello che la gente usa in Linux e \rnon è usata da sola per lo stesso scopo di \r\n. \rviene utilizzato in MacOS davvero vecchi. Non ho verificato questi fatti, comunque.
千里 ち ゃ ん

4
Non chiamarli \re \n, poiché il modo in cui \nviene gestito dipende da dove lo stai usando. Meglio chiamarli CRe LF.
Ignacio Vazquez-Abrams,

Ignacio, quegli acronimi non hanno alcun significato per me. Come lo chiami questo :/? OH ... ALIMENTAZIONE DELLA LINEA e RESO DEL TRASPORTO. Grazie, sleske.
千里 ち ゃ ん

@ IgnacioVazquez-Abrams \ n non è identico a LF? Su qualsiasi grafico ASCII, il carattere 13 = \ n = LF non è?
barlop

1
@barlop: non in C quando si esegue l'output in Windows.
Ignacio Vazquez-Abrams,

Risposte:


21

Penso che \ n sposta l'ago verso il basso e \ r sposta l'ago all'inizio di una linea (allineamento a sinistra)? Non sono sicuro, però

Questo è vero, più o meno, ma soprattutto una curiosità storica. Inizialmente, il linefeed (LF) veniva utilizzato per far avanzare la carta di una riga su stampanti e terminali cartacei ( teleprinter ); il ritorno a capo (CR) riporta la testina di stampa all'inizio della riga.

Questo probabilmente funziona ancora con le stampanti moderne quando viene utilizzato in "modalità testo", ma per il resto è poco rilevante oggi.

Ad ogni modo, mi è stato detto che Windows e Linux gestiscono le nuove linee e i ritorni a capo in modo diverso.

La differenza è semplicemente: i progettisti del sistema operativo dovevano scegliere come rappresentare l'inizio di una nuova riga nel testo nei file del computer. Per vari motivi storici, nel mondo Unix / Linux è stato scelto un singolo personaggio LF come marker di newline; MS-DOS ha scelto CR + LF e Windows l'ha ereditato. Pertanto piattaforme diverse utilizzano convenzioni diverse.

In pratica, questo sta diventando sempre meno un problema. L'indicatore di nuova riga è realmente rilevante solo per i pogrammi che elaborano il "testo semplice" e non ce ne sono molti - riguarda principalmente solo il codice sorgente del programma, i file di configurazione e alcuni semplici file di testo con documentazione. Oggi la maggior parte dei programmi che gestiscono questo tipo di file (editor, compilatori ecc.) Possono gestire entrambe le convenzioni newline, quindi non importa quale scegli.

Ci sono alcuni casi in cui gli strumenti insistono sulla "loro" convenzione newline (ad es. Gli script di shell Unix non devono usare CR + LF), nel qual caso devi usare quello giusto.


Stessa linea di domande: i linguaggi di programmazione riconoscono \n\re \nsono gli stessi? Ad esempio, se analizzassi un file di testo che è stato modificato sul PC di qualcun altro e contenesse sia la versione Linux che Windows delle interruzioni di riga, eseguirò un preg_matchfor \ne \n\rmi darei risultati diversi?
千里 ち ゃ ん

@ 千里 ち ゃ ん: questo dipende totalmente dal linguaggio di programmazione, dal compilatore ecc. In particolare, se usi regex, dipenderà dal motore regex che usi: alcuni distinguono diversi finali di linea, altri no (molti possono essere configurati in entrambi i modi, Credo).
sleske

@ 千里 ち ゃ ん: Se hai una domanda su come alcuni sistemi / linguaggio di programmazione / motore di espressioni regolari gestiscono convenzioni newline diverse, basta fare una domanda separata.
sleske

dovresti scrivere \ r \ n non nel modo sbagliato come sei. Per quanto riguarda i linguaggi di programmazione, sarebbero in grado di leggere singoli caratteri e tu il programmatore puoi vedere quale viene utilizzato nell'input, e tu il programmatore puoi anche fare ciò che desideri per l'output. Proprio come potresti dire "Scrivi ABC seguito da \ r \ r \ r \ n" qualunque personaggio tu voglia attaccare alla fine! alcuni altri personaggi potrebbero non essere stampabili e non essere grafici o altro. Potrebbero avere alcune funzioni integrate come println, e ciò che usano per la loro nuova linea sarebbe l'uno o l'altro, non può essere entrambi.
barlop

@ 千里 ち ゃ ん e alcuni linguaggi di programmazione possono permetterti di scegliere quale fine finire come impostazione in una delle loro funzioni incorporate, quindi anche in una funzione incorporata potresti ... in teoria comunque. + come detto, in pratica puoi scrivere qualunque fine di riga desideri ... anche se potresti non essere in grado di farlo in modo efficiente come con una funzione println.
barlop

14

CR e LF

L'American Standard Code for Information Interchange (ASCII) ha definito i caratteri di controllo tra cui CARRIAGE-RETURN (CR) e LINE-FEED (LF) che sono stati (e sono tuttora) utilizzati per controllare la posizione di stampa sulle stampanti in modo analogo al macchine da scrivere meccaniche che hanno preceduto le prime stampanti per computer.

Dipendenza dalla piattaforma

In Windows il tradizionale separatore di riga nei file di testo è CR seguito da LF

Nei vecchi sistemi Apple Macintosh (pre-OSX), il tradizionale separatore di riga nei file di testo era CR

In Unix e Linux, il tradizionale separatore di riga nei file di testo è LF.

\ n e \ r

In molti linguaggi di programmazione e scripting \nsignifica "nuova riga". A volte (ma non sempre) ciò significa che il carattere ASCII LINE-FEED (LF), che, come dici tu, sposta il cursore (o la posizione di stampa) su una riga. In una stampante o macchina da scrivere, ciò sposterebbe effettivamente la carta su una riga.

Invariabilmente \rsignifica il carattere ASCII CARRIAGE-RETURN (CR) il cui nome in realtà deriva da macchine da scrivere meccaniche in cui era presente una chiave di ritorno a capo che faceva spostare il rullo ("carrello") che trasportava la carta a destra, alimentato da una molla, fino in fondo. Impostando così l'attuale posizione di digitazione sul margine sinistro.

Programmazione

In alcuni linguaggi di programmazione \npuò significare una sequenza di caratteri dipendente dalla piattaforma che termina o separa le righe in un file di testo. Ad esempio in Perl, print "\n"produce una diversa sequenza di caratteri su Linux rispetto a Windows.

In Java, la migliore pratica, se si desidera utilizzare i finali di riga nativi per la piattaforma di runtime, non è di utilizzare \no \raffatto. Si dovrebbe usare System.getProperty("line.separator"). Dovresti usare \ne \rdove vuoi LF e CR indipendentemente dalla piattaforma (ad es. Come usato in HTTP, FTP e altri protocolli di comunicazione Internet).

Unix stty

In una shell Unix, il sttycomando può essere usato per far tradurre la shell tra queste varie convenzioni. Ad esempio stty -onlcr, la shell tradurrà successivamente tutti gli LF in uscita in LF CR.

Linux e OSX seguono le convenzioni Unix

File di testo

I file di testo sono ancora estremamente importanti e ampiamente utilizzati. Ad esempio, HTML e XML sono esempi di file di testo. La maggior parte dei protocolli Internet importanti, come HTTP, segue le convenzioni sui file di testo e include le specifiche per i finali di linea.

stampanti

La maggior parte delle stampanti diverse da quelle molto economiche, rispettano ancora CR e LF. In realtà sono fondamentali per i linguaggi di descrizione della pagina più utilizzati - PCL e Postscript.


1
Nota su Java: In genere non è vero che non si dovrebbe "non usare \ n o \ r". È solo che in Java, "\ n" è sempre LF e "\ r" è sempre CR. Questo può essere proprio quello che vuoi: se vuoi uno stile di fine linea specifico, usali; se si desidera esplicitamente la fine della riga nativa del computer su cui si esegue, quindi utilizzare line.separator. Dipende davvero da cosa vuoi.
sleske,

E BTW, println()usa automaticamente line.separator, quindi se vuoi un finale di linea nativo, puoi usare println()(e se hai bisogno di un certo tipo specifico di finale di linea, non usarlo, ma usa esplicitamente "\ n" ecc.).
sleske,

@sleske: buoni punti. Aggiornerò la mia risposta di conseguenza.
RedGrittyBrick

1
Esistono lingue o compilatori in cui \nè presente un carattere di controllo diverso da ASCII LF (diverso dai sistemi basati su EBCDIC)? Mi riferisco al \nsignificato letterale di una stringa o di un carattere, non all'effetto di inviarlo a un file o dispositivo di output.
Keith Thompson,

1
@KeithThompson: Per Java: Sì, \nè sempre il codice ASCII (e Unicode) 10, perché JLS lo dice esplicitamente (JLS 3.10.6, "Escape Sequences for Character and String Literals" - Ho controllato :-)). Per altre lingue - buona domanda.
sleske,

4

In breve, era necessario per le stampanti, ma ora i sistemi operativi lo fanno in modo leggermente diverso. Nella maggior parte dei casi, va bene solo fare CR e LF facendo \r\ne nella maggior parte dei casi, questo funzionerà bene.


Linux ignora semplicemente \ro provoca qualche tipo di cambiamento di comportamento?
Aaron Franke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.