Символ нового рядка JavaScript рядка?


424

Чи \nє універсальна послідовність символів нового рядка в JavaScript для всіх платформ? Якщо ні, то як визначити характер для поточного середовища?

Я не питаю про новий елемент HTML ( <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внутрішній рівень. У Javascript є стаття SitePoint із деякими додатковими подробицями, які називаються закінченнями рядків .

Зауважте також, що це не залежить від фактичних закінчень рядків у самому файлі 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
@Edson і неправильно, оскільки він буде розглядатись \r\nяк два нових рядки замість одного. Якщо ви хочете коротко, /\r?\n/gнапевно, це зробить (хто все ще використовує Mac OS 9?).
меркатор

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 ніколи не слід використовувати самостійно, хоча більшість apis та програм для Windows будуть розбирати його як новий рядок. LF працює так само добре і в Windows. CR - це лише артефакт того часу, коли комп'ютери були лише електронними машинками.
GolezTrol

3
@GolezTrol Є вагомі причини самостійно використовувати CR. Наприклад, повернення до початку рядка у вікні консолі, щоб перезаписати рядок, не переходячи до наступного рядка. Це часто використовується для запису змінних відсотків показників прогресу в утилітах командного рядка.
Ден Бешард

2
@ Дякую за відгук Звичайно, я ніколи не повинен був сказати "ніколи", тому що дійсно є заявки на КР самостійно. Але питання стосується Javascript не про утиліти командного рядка. Звичайно, може бути сценарій, що працює в режимі CLI (хоча я не знаю, чи працюватиме CR так, як ви сказали тоді), і ви навіть можете використовувати Javascript для створення сценарію, який запускається в командному рядку. Це можливі винятки з правила, але в контексті питання вони, здається, не застосовуються. Тим не менше, дякую, що згадуєте про це.
GolezTrol

65

Не використовуйте "\ n". Просто спробуйте:

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

Просто введіть зворотний кут і продовжуйте рух! Працює як шарм.


ES6 також підтримує багаторядкові значення з tildeсимволом (інакше називається backtick).
Касим

10
@Qasim - FYI, я вважаю, що тильда і backtick - це різні персонажі, див. ~Тільда проти `Бектіка .
Кріс Берджесс

1
Ага - Так, ти маєш рацію. ES6 використовує символ "backtick" для багаторядкових рядків
Qasim

2
Хоча легально, це нахмурилося в колах JS. Не вистачає читабельності. якщо ви можете, використовуйте підсилки ES6. Якщо ні, \ n
gotofritz

3
При написанні коду це працює. Схоже, що ОП стосується розбору тексту з текстової області, хоча.
jinglesthula

53

Можливо, найпростіше просто обробити всі випадки нового символу рядка, а не перевіряти, у якому випадку він застосовується. Наприклад, якщо вам потрібно замінити новий рядок, виконайте наступне:

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

1
Прекрасно. Чудово працює у пізніших версіях FF та IE (хоча не перевіряються старіші версії)
EvilDr


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 Scripting, яка використовується в таких програмах, як 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 .
Чарівно символ \ г , який використовується для повернення каретки працював для мене , як символ нового рядка.
Так що в деяких випадках корисно врахувати і те.


Це трапляється, якщо у вашій рядку є
гарнітура

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.