JavaScript строка символа новой строки?


424

Является ли \nуниверсальная последовательность символов новой строки в Javascript для всех платформ? Если нет, как мне определить характер для текущей среды?

Я не спрашиваю об элементе HTML newline ( <BR/>). Я спрашиваю о последовательности символов новой строки, используемой в строках JavaScript.


5
У меня есть элемент управления многострочным вводом, в котором пользователь должен вводить разделенный строкой список. Мне нужно разобрать список, сначала разбив строку на новые строки.
Лэндон Кун

7
@ landon9720: Для моих элементов управления многострочным вводом у меня есть getValueфункция, которая принимает valueи возвращает value.replace(/\r\n/g,'\n')- только для обеспечения согласованности вывода в разных браузерах / платформах.
Рой Тинкер

1
Хороший вопрос, особенно для тех, кто плохо знаком с программированием! Вне HTML и JavaScript полезно знать, как перейти к следующей / новой строке.
Эрик Бишард

Оформить заказ npmjs.com/package/eol
ryanve

Ответы:


362

Я только что протестировал несколько браузеров, использующих этот глупый кусочек 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 и Opera 9 на Windows используют \r\n. Все остальные протестированные мной браузеры (Safari 4 и Firefox 3.5 для Windows и Firefox 3.0 для Linux) используют \n. Все они могут \nпрекрасно работать при установке значения, хотя IE и Opera будут преобразовывать его обратно во \r\nвнутреннее состояние. Есть статья SitePoint с некоторыми подробностями, называемая окончаниями строк в Javascript .

Также обратите внимание, что это не зависит от фактических окончаний строк в самом файле HTML (оба \nи \r\nдают одинаковые результаты).

При отправке формы все браузеры канонизируют переводы строк %0D%0Aв кодировку URL. Чтобы увидеть это, загрузите, например, data:text/html,<form><textarea name="foo">foo%0abar</textarea><input type="submit"></form>и нажмите кнопку отправки. (Некоторые браузеры блокируют загрузку отправленной страницы, но вы можете увидеть значения формы в кодировке URL в консоли.)

Я не думаю, что вам действительно нужно делать что-то определенное. Если вы просто хотите разделить текст на новые строки, вы можете сделать что-то вроде этого:

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

14
Работал на меня, пришлось использовать глобальный флаг, хотя: / \ r \ n | \ r | \ n / g
AdrianoFerrari

17
@ Эдсон и не прав, так как он будет трактоваться \r\nкак два символа новой строки вместо одного. Если вы хотите короткую, /\r?\n/gвероятно , подойдет (кто все еще использует Mac OS 9?).
mercator

1
Учитывая, что статья SitePoint была написана в 2004 году, информация в ней может быть неактуальной для текущих реализаций JS.
cbmanica

Матч, предположительно, намного быстрее, чем сплит: jsperf.com/regex-split-vs-match
Wilt

Это кажется излишним, см. Мой ответ ниже для более простого решения!
Касим

81

Да, это универсально.

Хотя '\n'это универсальные символы новой строки , вы должны иметь в виду, что, в зависимости от вашего ввода, символам новой строки может предшествовать символ возврата каретки ( '\r').


55
\ n - универсальный символ перевода строки (LF). Точная последовательность байтов новой строки зависит от платформы (\ r \ n, \ n или \ r: en.wikipedia.org/wiki/Newline ). И это вопрос, который задает Лэндон. Вы противоречите себе, когда сначала говорите, что это универсальный символ новой строки, а затем говорите, что ему может предшествовать символ CR. Который из них?
Меркатор

2
\ n - символ перевода строки (перевода строки), даже если ему предшествует возврат каретки. CR никогда не должен использоваться сам по себе, хотя большинство приложений и приложений Windows будут воспринимать его как новую строку. LF работает так же хорошо в Windows. CR - это просто артефакт того времени, когда компьютеры были просто электронными печатными машинками.
GolezTrol

3
@GolezTrol Есть веские причины использовать CR самостоятельно. Например, возврат к началу строки в окне консоли, чтобы перезаписать строку, не переходя на следующую строку. Это часто используется для записи изменяющихся индикаторов прогресса в утилитах командной строки.
Дэн Бешард

2
@Dan Спасибо за отзыв. Конечно, я никогда не должен был говорить «никогда», потому что на самом деле существуют приложения для КР. Но вопрос о Javascript, а не об утилитах командной строки. Конечно, может быть скрипт, работающий в режиме CLI (хотя я не знаю, будет ли CR работать так, как вы сказали тогда), и вы даже можете использовать Javascript для генерации скрипта, который запускается в командной строке. Это возможные исключения из правила, но в контексте вопроса они, кажется, не применяются. Тем не менее, спасибо за упоминание этого.
GolezTrol

65

Не используйте "\ n". Просто попробуйте это:

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

Просто введите обратную косую черту и продолжайте движение! Работает как шарм.


ES6 также поддерживает многострочные значения с tildeсимволом (иначе называемый обратным трюком ).
Касим

10
@Qasim - К вашему сведению, я считаю, что тильда и backtick - разные персонажи, см. ~Tilde vs `Backtick .
Крис Берджесс

1
Ах, да, ты прав. ES6 использует символ обратной черты для многострочных строк
Qasim

2
Хотя это и законно, это осуждается в кругах JS. Ему не хватает читабельности. если вы можете, используйте задники ES6. Если нет, \ n
gotofritz

3
При написании кода это работает. Похоже, что OP - это анализ текста из текстовой области.
jinglesthula

53

Возможно, будет проще всего обработать все случаи символа новой строки вместо проверки, в каком случае применять его. Например, если вам нужно заменить символ новой строки, выполните следующие действия:

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

1
Superb. Прекрасно работает в более поздних версиях FF и IE (хотя не проверенные старые версии)
EvilDr

25

да используйте \ n, если вы не генерируете HTML-код, в котором вы хотите использовать <br />


13

Функция ссылки электронной почты, которую я использую "% 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>

Кто-нибудь знает этот тип кода для клавиши табуляции? я пробовал "% 0D% 09", но не работает.
Нилай,

7

Получите разделитель строк для текущего браузера:

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

3
Как насчет return textarea.value;?
XP1

Будет ли использование JSON.stringifyв результате изменить характер? Если я попытаюсь просмотреть результат в alert()вызове, он не покажет мне символ, если я сначала не

4

Примечание. При использовании ExtendScript JavaScript (язык сценариев Adobe, используемый в таких приложениях, как Photoshop CS3 +), символом, который нужно использовать, является «\ r». «\ n» будет интерпретироваться как символ шрифта, и поэтому многие шрифты будут иметь символ блока.

Например (чтобы выбрать слой с именем «Примечание» и добавить перевод строки после всех периодов):

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

Пытался выяснить, почему \nи <br/>не работал в моем скрипте Photoshop ... Спасибо!
Джейк Стоффлер

3

Вы можете использовать `` кавычки (которые находятся ниже кнопки Esc) с ES6. Таким образом, вы можете написать что-то вроде этого:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;

1

Я считаю, что это - когда вы работаете со строками JS.

Однако, если вы генерируете HTML, вам придется использовать <br />теги (нет \n, поскольку вы больше не имеете дело с JS)


1

У меня была проблема с выражением новой строки с \ n или \ r \ n .
Волшебно символ \ г , который используется для возврата каретки работал для меня , как символ новой строки.
Так что в некоторых случаях полезно рассмотреть \ r тоже.


Это происходит, если ваша строка имеет кодировку 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

Печать:

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

0

Практическое наблюдение ... В моем скрипте NodeJS у меня есть следующая функция:

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

Сначала у меня было только "\ n", но я заметил, что когда я открываю файл журнала в Блокноте, он показывает все записи в одной строке. Блокнот ++, с другой стороны, отображает записи в каждой строке. После изменения кода на «\ r \ n» даже Блокнот показывает каждую запись в отдельной строке.


-3

Это \nпросто отлично для всех случаев, с которыми я столкнулся. Если вы работаете с сетью, используйте \nи не беспокойтесь об этом (если только у вас не было проблем, связанных с переводом строки).


-13

Вы можете использовать <br/>и document.write/, document.writelnодин.


4
Пожалуйста, перечитайте вопрос. В нем конкретно говорится, что он не спрашивает о<br>
Ли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.