Caractere de nova linha da string JavaScript?

424

A \nsequência universal de caracteres de nova linha está em Javascript para todas as plataformas? Caso contrário, como determino o caractere para o ambiente atual?

Não estou perguntando sobre o elemento de nova linha HTML ( <BR/>). Estou perguntando sobre a sequência de caracteres da nova linha usada nas seqüências de caracteres JavaScript.

Landon Kuhn
fonte
5
Eu tenho um controle de entrada multilinha em que o usuário deve inserir uma lista separada por nova linha. Preciso analisar a lista primeiro dividindo a string em novas linhas.
Landon Kuhn
7
@ landon9720: Para meus controles de entrada de várias linhas, tenho uma getValuefunção que aceita valuee retorna value.replace(/\r\n/g,'\n')- apenas para manter a saída consistente entre navegadores / plataformas.
Roy Tinker
1
Boa pergunta, especialmente para quem é novo na programação! Fora do HTML e do JavaScript, é bom saber como passar para a próxima / nova linha.
Eric Bishard
Checkout npmjs.com/package/eol
ryanve

Respostas:

362

Acabei de testar alguns navegadores usando esse pouco de 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 no Windows \r\n. Todos os outros navegadores que testei (Safari 4 e Firefox 3.5 no Windows e Firefox 3.0 no Linux) usam \n. Todos eles podem lidar \nmuito bem ao definir o valor, embora o IE e o Opera os convertam \r\nnovamente em internamente. Há um artigo do SitePoint com mais alguns detalhes chamados Finalizações de linha em Javascript .

Observe também que isso é independente das terminações de linha reais no próprio arquivo HTML (ambos \ne \r\nfornecem os mesmos resultados).

Ao enviar um formulário, todos os navegadores podem canonizar novas linhas %0D%0Ana codificação de URL. Para ver isso, carregue, por exemplo, data:text/html,<form><textarea name="foo">foo%0abar</textarea><input type="submit"></form>e pressione o botão enviar. (Alguns navegadores bloqueiam o carregamento da página enviada, mas você pode ver os valores do formulário codificado por URL no console.)

Eu não acho que você realmente precise fazer muita determinação, no entanto. Se você quiser apenas dividir o texto em novas linhas, faça algo assim:

lines = foo.value.split(/\r\n|\r|\n/g);
mercator
fonte
14
Trabalhou para mim, mas teve que usar a bandeira global: / \ r \ n | \ r | \ n / g
AdrianoFerrari
17
@ Edson e errado, pois tratará \r\ncomo duas novas linhas em vez de uma. Se você quer um resumo, /\r?\n/gprovavelmente o fará (quem ainda usa o Mac OS 9?).
mercator 27/03
1
Como o artigo do SitePoint é de 2004, as informações podem não ser relevantes para as implementações atuais do JS.
Cbmanica 01/10
Jogo é supostamente muito mais rápido do que dividido: jsperf.com/regex-split-vs-match
Wilt
Isso parece exagero, veja minha resposta abaixo para uma solução mais simples!
Qasim
81

Sim, é universal.

Embora '\n'sejam os caracteres universais da nova linha , lembre-se de que, dependendo da sua entrada, os novos caracteres de linha podem ser precedidos por caracteres de retorno de carro ( '\r').

Sinan Taifour
fonte
55
\ n é o caractere universal de avanço de linha (LF). A sequência exata de bytes da nova linha depende da plataforma (\ r \ n, \ n ou \ r: en.wikipedia.org/wiki/Newline ). E essa é a pergunta que landon está fazendo. Você se contradiz quando diz que é o caractere universal de nova linha e depois diz que pode ser precedido por um CR. Qual é esse?
Mercator
2
\ n é o caractere de nova linha (avanço de linha), mesmo que seja precedido por um retorno de carro. O CR nunca deve ser usado por si só, embora a maioria das APIs e aplicativos do Windows o analise como uma nova linha. O LF também funciona bem no Windows. O CR é apenas um artefato da época em que os computadores eram apenas máquinas de escrever eletrônicas.
GolezTrol
3
@GolezTrol Existem razões válidas para usar o CR por conta própria. Por exemplo, retornando ao início da linha em uma janela do console para sobrescrever a linha, sem passar para a próxima linha. Isso geralmente é usado para escrever indicadores de progresso percentual variáveis ​​nos utilitários de linha de comando.
Dan Bechard
2
@ Dan Obrigado pelo feedback. Obviamente, eu nunca deveria ter dito "nunca", porque existem de fato aplicativos para um CR por conta própria. Mas a questão é sobre Javascript, não sobre utilitários de linha de comando. É claro que pode haver um script em execução no modo CLI (embora eu não saiba se o CR funcionará como você disse na época), e você pode até usar o Javascript para gerar um script que é executado na linha de comando. Essas são possíveis exceções à regra, mas no contexto da pergunta elas parecem não se aplicar. No entanto, obrigado por mencionar.
precisa saber é o seguinte
65

Não use "\ n". Apenas tente o seguinte:

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

Basta digitar uma barra invertida e continuar andando! Funciona como um encanto.

Qasim
fonte
O ES6 também suporta valores de várias linhas com o tildecaractere (também chamado de backtick).
Qasim
10
@Qasim - FYI, acredito que til e backtick são caracteres diferentes, veja ~Tilde vs `Backtick .
Chris Burgess
1
Ah - Sim, você está certo. O ES6 usa o caractere backtick para cadeias de
linhas múltiplas
2
Embora legal, isso é desaprovado nos círculos da JS. Falta legibilidade. se puder, use os backticks do ES6. Se não, \ n
gotofritz 7/17
3
Ao escrever código, isso funciona. Parece que o OP é sobre analisar o texto de uma área de texto.
Jinglesthula # 30/17
53

Pode ser mais fácil manipular todos os casos do caractere de nova linha em vez de verificar qual caso e aplicá-lo. Por exemplo, se você precisar substituir a nova linha, faça o seguinte:

htmlstring = stringContainingNewLines.replace(/(\r\n|\n|\r)/gm, "<br>");
Quincy
fonte
1
Soberbo. Funciona muito bem em versões posteriores FF e IE (não testado versões antigas embora)
EvilDr
25

sim use \ n, a menos que você esteja gerando código html, no qual deseja usar <br />

Finer Recliner
fonte
13

Função de link de e-mail, eu uso "% 0D% 0A"

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

var MailMSG = "mailto:[email protected]" 
         + "[email protected]" 
         + "&subject=subject" 
         + "&body=" + bodydata; 
window.location.href = MailMSG; 
} 

[HTML]

<a href="#" onClick="sendMail()">Contact Us</a>
ISCI
fonte
alguém conhece esse tipo de código para a tecla tab? Estou tentando "% 0D% 09", mas não está funcionando.
Nilay
7

Obtenha um separador de linhas para o navegador atual:

function getLineSeparator() {
  var textarea = document.createElement("textarea");
  textarea.value = "\n"; 
  return textarea.value;
}
Vitalii Fedorenko
fonte
3
Que tal return textarea.value;?
XP1
O uso JSON.stringifyno resultado mudará o personagem? Se eu tentar ver o resultado de uma alert()chamada não me mostrar o caráter a menos que eu stringify pela primeira vez (não que as necessidades de char para ser legível para ser eficaz, é claro)
4

Uma observação - ao usar o ExtendScript JavaScript (a linguagem de script da Adobe usada em aplicativos como o Photoshop CS3 +), o caractere a ser usado é "\ r". "\ n" será interpretado como um caractere de fonte e, portanto, muitas fontes terão um caractere de bloco.

Por exemplo (para selecionar uma camada chamada 'Nota' e adicionar feeds de linha após todos os períodos):

var layerText = app.activeDocument.artLayers.getByName('Note').textItem.contents;
layerText = layerText.replace(/\. /g,".\r");
JayCrossler
fonte
Estava tentando descobrir o porquê \ne <br/>não estava trabalhando no meu script do Photoshop ... Obrigado!
precisa
3

Você pode usar `` aspas (que estão abaixo do botão Esc) com o ES6. Então você pode escrever algo como isto:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;
Bogdan Surai
fonte
1

Eu acredito que sim - quando você estiver trabalhando com strings JS.

Se você estiver gerando HTML, precisará usar <br />tags (não \n, pois não está mais lidando com JS)

Pascal MARTIN
fonte
1

Eu tive o problema de expressar nova linha com \ n ou \ r \ n .
Magicamente o personagem \ r que é usado para retorno de carro funcionou para mim como uma nova linha.
Assim, em alguns casos, é útil considerar também.

Oralet
fonte
Isso acontece se a cadeia tem o ISO-8859-1 charset
CodeBrauer
0
printAccountSummary: function()
        {return "Welcome!" + "\n" + "Your balance is currently $1000 and your interest rate is 1%."}
};
console.log(savingsAccount.printAccountSummary()); // method

Impressões:

Welcome!
Your balance is currently $1000 and your interest rate is 1%.
Barbs G
fonte
0

Uma observação prática ... No meu script NodeJS, tenho a seguinte função:

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

Primeiro eu tinha apenas "\ n", mas notei que quando abro o arquivo de log no Bloco de Notas, ele mostra todas as entradas na mesma linha. O Notepad ++, por outro lado, mostra as entradas cada uma em sua própria linha. Após alterar o código para "\ r \ n", até o Bloco de Notas mostra todas as entradas em sua própria linha.

user11717468
fonte
-3

O \né apenas multa para todos os casos que eu encontrei. Se você estiver trabalhando com a Web, use \ne não se preocupe com isso (a menos que tenha tido problemas relacionados à nova linha).

zzandy
fonte
-13

você pode usar <br/>e o document.write/, document.writelnum.

omari Powell
fonte
4
Por favor, leia novamente a pergunta. Ela diz especificamente que ele é não perguntar sobre<br>
Leigh