Domanda

Come sono \r e \n diverso? Penso che abbia qualcosa a che fare con Unix vs Windows vs Mac, ma non sono sicuro esattamente come sono diversi e che per cercare / partita in regex.

È stato utile?

Soluzione

Sono personaggi diversi. \r è ritorno del carrello, ed è \n avanzamento riga.

Nelle stampanti "vecchi", \r inviato la testina di stampa torna al punto di partenza della linea, e \n avanzato la carta di una riga. Entrambi erano quindi necessario per avviare la stampa sulla riga successiva.

Ovviamente questo è in qualche modo irrilevante ora, anche se a seconda della console si può ancora essere in grado di utilizzare \r per spostarsi all'inizio della riga e sovrascrivere il testo esistente.

Ancora più importante, Unix tende ad utilizzare \n come separatore di linea; Di Windows tende ad usare \r\n come separatore di linea e Mac (fino a OS 9) utilizzato per utilizzare \r come separatore di linea. (Mac OS X è Unix-y, quindi utilizza \n invece,. Ci possono essere alcune situazioni in cui compatibilità \r è utilizzato in luogo però)

Per ulteriori informazioni, vedere la Wikipedia articolo ritorno a capo .

EDIT: Questo è sensibile al linguaggio. In C # e Java, per esempio, \n sempre significa Unicode U + 000A, che è definito come avanzamento riga. In C e C ++ l'acqua è un po 'più fangosa, come il significato è specifico della piattaforma. Vedere i commenti per i dettagli.

Altri suggerimenti

In C e C ++, \n è un concetto, \r è un personaggio, e \r\n è (quasi sempre) un bug portabilità.

Pensate di una vecchia telescrivente. La testina di stampa è posizionata su qualche linea e in qualche colonna. Quando si invia un carattere stampabile alla telescrivente, stampa il carattere nella posizione corrente e sposta il testa alla colonna successiva. (Questo è concettualmente la stessa come una macchina da scrivere, macchine da scrivere salvo che tipicamente mosso la carta rispetto alla testina di stampa.)

Quando si voleva finire la riga corrente e iniziare nella riga successiva, si doveva fare due fasi distinte:

  1. spostare la testina di stampa ritorna all'inizio della riga, quindi
  2. spostarla verso il basso alla riga successiva.

ASCII codifica per queste azioni come due caratteri di controllo distinte:

  • \x0D (CR) si sposta la testina di stampa di nuovo all'inizio della riga. (Unicode codifica questo come U+000D CARRIAGE RETURN.)
  • \x0A (LF) sposta la testina di stampa verso il basso alla riga successiva. (Unicode codifica questo come U+000A LINE FEED.)

Nei giorni di telescriventi e stampanti tecnologia primi, le persone effettivamente hanno approfittato del fatto che si trattava di due operazioni separate. Inviando un CR senza seguire esso da una LF, si potrebbe stampare oltre la linea che già stampati. Questo ha permesso effetti come accenti, grassetto e la sottolineatura. Alcuni sistemi sovrastampati più volte per evitare che le password di essere visibile in formato cartaceo. Su terminali CRT seriali primi, CR è uno dei modi per controllare la posizione del cursore per aggiornare il testo già sullo schermo.

Ma la maggior parte del tempo, è in realtà volevamo solo andare alla riga successiva. Anziché richiedere la coppia di caratteri di controllo, alcuni sistemi consentito solo uno o l'altro. Ad esempio:

  • varianti di Unix (comprese le versioni moderne di Mac) utilizzare solo un carattere LF per indicare un ritorno a capo.
  • file vecchio (pre-OSX) Macintosh utilizzato solo un carattere CR per indicare un ritorno a capo.
  • VMS, CP / M, DOS, Windows, e molti protocolli di rete ancora si aspettano sia: CR LF
  • .
  • sistemi vecchi IBM che usato EBCDIC standardizzato su NL - un personaggio che non esiste nemmeno nel carattere ASCII impostato. In Unicode, NL è U+0085 NEXT LINE, ma il valore effettivo EBCDIC è 0x15.

Perché scegliere sistemi differenti metodi diversi? Semplicemente perché non vi era alcuna norma universale. Dove la tastiera probabilmente dice "Enter", tastiere anziani dicevano "Return", che è stato breve per il trasporto di ritorno. Infatti, su un terminale seriale, premendo Return effettivamente invia il carattere CR. Se si stesse scrivendo un editor di testo, si sarebbe tentati di utilizzare solo quel carattere come è arrivato dalla terminale. Forse è per questo che i vecchi Mac usati solo CR.

Ora che abbiamo gli standard , ci sono più modi per rappresentare le interruzioni di linea. Anche se estremamente raro in natura, Unicode ha nuovi personaggi come:

  • U+2028 LINE SEPARATOR
  • U+2029 PARAGRAPH SEPARATOR

Anche prima Unicode è arrivato, i programmatori hanno voluto semplici modi per rappresentare alcuni dei codici di controllo più utili, senza preoccuparsi del set di caratteri di base. C ha diverse sequenze di escape per rappresentare codici di controllo:

  • \a (per l'avviso) che suona la campana telescrivente o rende il bip terminale
  • \f (per l'avanzamento), che sposta all'inizio della pagina successiva
  • \t (per scheda), che sposta la testina di stampa alla successiva tabulazione orizzontale

(La lista è volutamente incompleta.)

Questa mappatura avviene a a tempo di compilazione -. Il compilatore vede \a e mette qualsiasi valore magia viene utilizzato per suonare il campanello

Avviso that la maggior parte di questi mnemonica hanno correlazioni scalo a codici di controllo ASCII. Ad esempio, sarebbe \a mappare 0x07 BEL. Un compilatore potrebbe essere scritta per un sistema che utilizza qualcosa di diverso da ASCII per il set di caratteri host (ad esempio, EBCDIC). La maggior parte dei codici di controllo che avevano mnemonici specifici potrebbe essere mappata per controllare i codici di altri set di caratteri.

Huzzah! Portabilità!

Beh, quasi. In C, ho potuto scrivere printf("\aHello, World!"); che suona la campana (o bip) ed emette un messaggio. Ma se volessi poi stampare qualcosa nella riga successiva, avevo ancora bisogno di sapere che cosa la piattaforma host richiede di passare alla successiva riga di output. CR LF? CR? LF? NL? Qualcos'altro? Questo per quanto riguarda la portabilità.

C dispone di due modalità per I / O: binari e di testo. In modalità binaria, qualunque sia i dati vengono inviati viene trasmesso così com'è. Ma in modalità testo, c'è una run-time di traduzione che converte un carattere speciale a tutto ciò che la piattaforma host ha bisogno di una nuova linea (e viceversa).

Grande, quindi qual è il carattere speciale?

Bene, questa è a carico di attuazione, anche, ma c'è un modo implementazione indipendente specificarlo: \n. E 'in genere chiamato il "carattere di nuova riga".

Questo è un punto sottile ma importante: \n è mappato a di compilazione per un valore di carattere implementazione definita che (in modalità testuale ) viene quindi mappata nuovamente a runtime al carattere effettivo (o sequenza di caratteri) richieste dalla piattaforma sottostante per passare alla riga successiva.

\n è diverso da tutti gli altri letterali barra rovesciata perché ci sono due mappature coinvolti. Questa mappatura in due fasi rende \n significativamente diverso anche \r, che è semplicemente una mappatura fase di compilazione di CR (o il codice di controllo più simile in qualsiasi set di caratteri di fondo è).

Questa viaggi fino molti programmatori C e C ++. Se si dovesse sondaggio 100 di loro, almeno il 99 vi diranno che \n significa avanzamento riga. Questo non è del tutto vero. La maggior parte (forse tutti) implementazioni C e C ++ utilizzano LF come valore intermedio magica per \n, ma questo è un dettaglio di implementazione. E 'possibile per un compilatore di utilizzare un valore diverso. Infatti, se il set di caratteri host non è un superset di ASCII (ad esempio, se si tratta di EBCDIC), quindi \n sarà quasi certamente non sarà LF.

Quindi, in C e C ++:

  • \r è letteralmente un ritorno a capo.
  • \n è un valore magico che viene tradotto (in modalità testo) a run-time da / per la semantica di nuova riga della piattaforma host.
  • \r\n è quasi sempre un bug portabilità. In modalità testo, questo viene tradotto in CR seguita dalla sequenza di ritorno a capo della piattaforma - probabilmente non ciò che è previsto. In modalità binaria, questo viene tradotto in CR seguito da un valore magico che potrebbe non essere LF - forse non quello che è destinato
  • .
  • \x0A è il modo più portatile per indicare un LF ASCII, ma si desidera solo di farlo in modalità binaria. La maggior parte delle implementazioni in modalità testo tratteranno che, come \n.
  • "\ r" => Return
  • "\ n" => Newline o Linefeed (Semantica)

  • sistemi
  • basati su Unix usano solo un "\ n" per terminare una riga di testo.

  • Dos usa "\ r \ n" per terminare una riga di testo.
  • Alcune altre macchine usate solo un "\ r". (Commodore, Apple II, Mac OS prima di OS X, ecc ..)

In breve \ r ha un valore ASCII 13 (CR) e \ n ha valore ASCII 10 (LF). Mac utilizza CR come delimitatore di riga (almeno, lo ha fatto prima, non sono sicuro per i Mac moderni), * nix utilizza LF e Windows utilizza sia (CRLF).

\r è usato per indicare l'inizio di una linea e può sostituire il testo da lì, per esempio.

main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}

produce questo risultato:

hai

\n è per la nuova linea.

In aggiunta alla risposta di @ Jon Skeet:

Tradizionalmente Windows è utilizzato \ r \ n, Unix \ n e Mac \ r, tuttavia recenti i Mac usano \ n come sono basati su UNIX.

in C # ho scoperto che usano \ r \ n in una stringa.

\ r è Carriage Return; \ N è una nuova linea (Line Feed) ... dipende dal sistema operativo come a ciò che ogni mezzo. Leggi questo articolo per più sulla differenza tra '\ n' e '\ r \ n' ... in C.

\ r utilizzato per ritorno a capo. (Valore ASCII è 13) \ N utilizzato per la nuova linea. (Valore ASCII è 10)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top