Carattere newline stringa JavaScript?


424

La \nsequenza di caratteri newline universale è in Javascript per tutte le piattaforme? In caso contrario, come posso determinare il carattere per l'ambiente attuale?

Non sto chiedendo dell'elemento HTML newline ( <BR/>). Sto chiedendo della sequenza di caratteri newline utilizzata nelle stringhe JavaScript.


5
Ho un controllo di input su più righe in cui l'utente dovrebbe inserire un elenco separato da una nuova riga. Ho bisogno di analizzare l'elenco dividendo prima la stringa su newline.
Landon Kuhn,

7
@ landon9720: Per i miei controlli di input multilinea, ho una getValuefunzione che accetta valuee restituisce value.replace(/\r\n/g,'\n'), solo per mantenere l'output coerente su browser / piattaforme.
Roy Tinker

1
Bella domanda soprattutto per coloro che non conoscono la programmazione! Al di fuori di HTML e JavaScript è bene sapere come passare alla riga successiva / nuova.
Eric Bishard,

Risposte:


362

Ho appena testato alcuni browser usando questo stupido bit di JavaScript:

function log_newline(msg, test_value) {
  if (!test_value) { 
    test_value = document.getElementById('test').value;
  }
  console.log(msg + ': ' + (test_value.match(/\r/) ? 'CR' : '')
              + ' ' + (test_value.match(/\n/) ? 'LF' : ''));
}

log_newline('HTML source');
log_newline('JS string', "foo\nbar");
log_newline('JS template literal', `bar
baz`);
<textarea id="test" name="test">

</textarea>

IE8 e Opera 9 su Windows \r\n. Tutti gli altri browser che ho testato (Safari 4 e Firefox 3.5 su Windows e Firefox 3.0 su Linux) utilizzano \n. Tutti possono gestire \nbene quando si imposta il valore, anche se IE e Opera lo convertiranno \r\nnuovamente in internamente. C'è un articolo di SitePoint con alcuni dettagli chiamati Endline in Javascript .

Si noti inoltre che questo è indipendente dalle terminazioni di riga effettive nel file HTML stesso (entrambi \ne \r\ndanno gli stessi risultati).

Quando si invia un modulo, tutti i browser possono canonicalizzare le nuove righe %0D%0Anella codifica URL. Per vederlo, carica ad es. data:text/html,<form><textarea name="foo">foo%0abar</textarea><input type="submit"></form>E premi il pulsante di invio. (Alcuni browser bloccano il caricamento della pagina inviata, ma è possibile visualizzare i valori del modulo con codifica URL nella console.)

Tuttavia, non penso che tu debba davvero fare molte determinazioni. Se vuoi solo dividere il testo su newline, potresti fare qualcosa del genere:

lines = foo.value.split(/\r\n|\r|\n/g);

14
Ha funzionato per me, ma ho dovuto usare la bandiera globale: / \ r \ n | \ r | \ n / g
AdrianoFerrari,

17
@ Edson e sbagliato, poiché tratterà \r\ncome due nuove righe anziché una. Se lo desideri, /\r?\n/gprobabilmente lo farà (chi utilizza comunque Mac OS 9?).
mercatore

1
Dato che l'articolo di SitePoint è del 2004, le informazioni potrebbero non essere rilevanti per le attuali implementazioni di JS.
cbmanica,

La partita è presumibilmente molto più veloce della divisione: jsperf.com/regex-split-vs-match
Wilt

Sembra eccessivo, vedi la mia risposta qui sotto per una soluzione più semplice!
Qasim,

81

Sì, è universale.

Sebbene '\n'siano i caratteri di nuova riga universali , è necessario tenere presente che, a seconda dell'input, i caratteri di nuova riga potrebbero essere preceduti da caratteri di ritorno a capo ( '\r').


55
\ n è il carattere di avanzamento riga universale (LF). L'esatta sequenza di byte newline dipende dalla piattaforma (\ r \ n, \ n o \ r: en.wikipedia.org/wiki/Newline ). E questa è la domanda che Landon sta ponendo. Stai contraddicendo te stesso quando dici per la prima volta che è il personaggio newline universale, e poi dici che può essere preceduto da un CR. Qual é?
mercatore,

2
\ n è il carattere newline (avanzamento riga), anche se è preceduto da un ritorno a capo. CR non dovrebbe mai essere usato da solo, anche se la maggior parte delle API e delle app di Windows lo analizzeranno come una nuova riga. LF funziona altrettanto bene anche in Windows. CR è solo un artefatto dal momento in cui i computer erano solo macchine da scrivere elettroniche.
GolezTrol,

3
@GolezTrol Esistono validi motivi per utilizzare CR da solo. Ad esempio, tornando all'inizio della riga in una finestra della console per sovrascrivere la riga, senza passare alla riga successiva. Questo è spesso usato per scrivere cambiando gli indicatori di progresso percentuale nelle utility della riga di comando.
Dan Bechard,

2
@Dan Grazie per il feedback. Certo, non avrei mai dovuto dire "mai", perché ci sono davvero applicazioni per un CR da solo. Ma la domanda riguarda Javascript non le utilità della riga di comando. Naturalmente potrebbe esserci uno script in esecuzione in modalità CLI (anche se non so se CR funzionerà come hai detto allora), e potresti persino usare Javascript per generare uno script che viene eseguito nella riga di comando. Queste sono possibili eccezioni alla regola, ma nel contesto della domanda sembrano non applicarsi. Tuttavia, grazie per averlo menzionato.
GolezTrol,

65

Non utilizzare "\ n". Prova questo:

var string = "this\
is a multi\
line\
string";

Basta inserire una barra rovesciata e continuare su camion! Funziona come un fascino.


ES6 supporta anche valori multilinea con il tildecarattere (altrimenti chiamato backtick).
Qasim,

10
@Qasim - Cordiali saluti, credo che tilde e backtick siano personaggi diversi, vedi ~Tilde vs `Backtick .
Chris Burgess,

1
Ah - Sì, hai ragione. ES6 usa il carattere backtick per le stringhe multilinea
Qasim

2
Sebbene legale, questo è disapprovato nei circoli JS. Manca di leggibilità. se puoi, usa i backtick di ES6. In caso contrario, \ n
gotofritz

3
Quando si scrive codice funziona. Sembra però che il PO riguardi l'analisi del testo da un'area di testo.
jinglesthula,

53

Potrebbe essere più semplice gestire tutti i casi del nuovo carattere di riga invece di controllare quale caso e applicarlo. Ad esempio, se è necessario sostituire la nuova riga, procedere come segue:

htmlstring = stringContainingNewLines.replace(/(\r\n|\n|\r)/gm, "<br>");

1
Superba. Funziona alla grande nelle versioni successive FF e IE (non testate versioni precedenti però)
EvilDr


13

Funzione collegamento e-mail utilizzo "% 0D% 0A"

function sendMail() {   
var bodydata="Before "+ "%0D%0A";
    bodydata+="After"

var MailMSG = "mailto:aaa@sss.com" 
         + "?cc=07@sss.com" 
         + "&subject=subject" 
         + "&body=" + bodydata; 
window.location.href = MailMSG; 
} 

[HTML]

<a href="#" onClick="sendMail()">Contact Us</a>

qualcuno conosce questo tipo di codice per il tasto tab? ho provato "% 0D% 09" ma non funziona.
Nilay,

7

Ottieni un separatore di riga per il browser corrente:

function getLineSeparator() {
  var textarea = document.createElement("textarea");
  textarea.value = "\n"; 
  return textarea.value;
}

3
Che ne dici return textarea.value;?
XP1

L'uso JSON.stringifydel risultato cambierà il personaggio? Se provo a visualizzare il risultato in una alert()chiamata, non mi mostra il personaggio a meno che non lo stringi prima (non che il carattere debba essere leggibile dall'uomo per essere efficace, ovviamente)

4

Nota: quando si utilizza ExtendScript JavaScript (il linguaggio Adobe Scripting utilizzato in applicazioni come Photoshop CS3 +), il carattere da utilizzare è "\ r". "\ n" verrà interpretato come un carattere di carattere e molti caratteri avranno quindi un carattere di blocco.

Ad esempio (per selezionare un livello denominato 'Nota' e aggiungere feed di riga dopo tutti i periodi):

var layerText = app.activeDocument.artLayers.getByName('Note').textItem.contents;
layerText = layerText.replace(/\. /g,".\r");

Stavo cercando di capire perché \ne <br/>non funzionavo nella mia sceneggiatura di Photoshop ... Grazie!
Jake Stoeffler

3

Puoi usare le virgolette (che sono sotto il pulsante Esc) con ES6. Quindi puoi scrivere qualcosa del genere:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;

1

Credo di si - quando lavori con le stringhe JS.

Se stai generando HTML, però, dovrai usare i <br />tag (no \n, poiché non hai più a che fare con JS)


1

Ho avuto il problema di esprimere newline con \ n o \ r \ n .
Magicamente il carattere \ r che viene utilizzato per il ritorno del carrello ha lavorato per me come un ritorno a capo.
Quindi, in alcuni casi, è utile considerare anche.


Questo succede se la tua stringa ha il set di caratteri ISO-8859-1
CodeBrauer

0
printAccountSummary: function()
        {return "Welcome!" + "\n" + "Your balance is currently $1000 and your interest rate is 1%."}
};
console.log(savingsAccount.printAccountSummary()); // method

stampe:

Welcome!
Your balance is currently $1000 and your interest rate is 1%.

0

Un'osservazione pratica ... Nel mio script NodeJS ho la seguente funzione:

function writeToLogFile (message) {
    fs.appendFile('myserverlog.txt', Date() + " " + message + "\r\n", function (err) {
        if (err) throw err;
    });
}

All'inizio avevo solo "\ n" ma ho notato che quando apro il file di registro in Blocco note, mostra tutte le voci sulla stessa riga. Notepad ++ invece mostra le voci ognuna sulla propria riga. Dopo aver modificato il codice in "\ r \ n", anche Blocco note mostra ogni voce sulla propria riga.


-3

Il \nè bene per tutti i casi che ho incontrato. Se stai lavorando con il web, utilizzalo \ne non ti preoccupare (a meno che tu non abbia avuto problemi relativi a Newline).


-13

è possibile utilizzare <br/>e document.write/, document.writelnuno.


4
Rileggi la domanda. Si dice espressamente che è non chiedendo di<br>
Leigh
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.