Chuỗi ký tự JavaScript mới?


424

\nchuỗi ký tự dòng mới phổ biến trong Javascript cho tất cả các nền tảng? Nếu không, làm cách nào để xác định ký tự cho môi trường hiện tại?

Tôi không hỏi về phần tử dòng mới HTML ( <BR/>). Tôi đang hỏi về chuỗi ký tự dòng mới được sử dụng trong các chuỗi JavaScript.


5
Tôi có một điều khiển đầu vào đa dòng trong đó người dùng dự kiến ​​sẽ nhập một danh sách mới được phân tách. Tôi cần phân tích danh sách bằng cách trước tiên tách chuỗi trên dòng mới.
Landon Kuhn

7
@ Landon9720: Đối với các điều khiển đầu vào đa dòng của tôi, tôi có một getValuechức năng nhận valuevà trả về value.replace(/\r\n/g,'\n')- chỉ để giữ đầu ra nhất quán trên các trình duyệt / nền tảng.
Roy Tinker

1
Câu hỏi hay đặc biệt là cho những người mới lập trình! Ngoài HTML và trong JavaScript, thật tốt khi biết cách chuyển sang dòng tiếp theo / mới.
Eric Bishard

Câu trả lời:


362

Tôi vừa thử nghiệm một vài trình duyệt sử dụng đoạn mã JavaScript ngớ ngẩn này:

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 và Opera 9 trên Windows sử dụng \r\n. Tất cả các trình duyệt khác mà tôi đã thử nghiệm (Safari 4 và Firefox 3.5 trên Windows và Firefox 3.0 trên Linux) đều sử dụng \n. Tất cả đều có thể xử lý \ntốt khi đặt giá trị, mặc dù IE và Opera sẽ chuyển đổi lại thành \r\nnội bộ. Có một bài viết SitePoint với một số chi tiết khác được gọi là kết thúc dòng trong Javascript .

Cũng lưu ý rằng điều này độc lập với các kết thúc dòng thực tế trong chính tệp HTML (cả hai \n\r\ncho cùng một kết quả).

Khi gửi biểu mẫu, tất cả các trình duyệt sẽ hợp thức hóa các dòng mới %0D%0Atrong mã hóa URL. Để thấy điều đó, tải ví dụ data:text/html,<form><textarea name="foo">foo%0abar</textarea><input type="submit"></form>và nhấn nút gửi. (Một số trình duyệt chặn tải của trang đã gửi, nhưng bạn có thể thấy các giá trị biểu mẫu được mã hóa URL trong bảng điều khiển.)

Tuy nhiên, tôi không nghĩ rằng bạn thực sự cần phải thực hiện bất kỳ quyết định nào. Nếu bạn chỉ muốn phân chia văn bản trên dòng mới, bạn có thể làm một cái gì đó như thế này:

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

14
Làm việc cho tôi, đã phải sử dụng cờ toàn cầu: / \ r \ n | \ r | \ n / g
AdrianoFerrari

17
@Edson và sai, vì nó sẽ coi \r\nlà hai dòng mới thay vì một. Nếu bạn muốn ngắn, /\r?\n/gcó thể sẽ làm (ai vẫn sử dụng Mac OS 9 chứ?).
Mercator

1
Cho rằng bài viết SitePoint là từ năm 2004, thông tin có thể không liên quan đến các triển khai JS hiện tại.
cbmanica

Trận đấu được cho là nhanh hơn nhiều so với chia: jsperf.com/regex-split-vs-match
Wilt

Điều này có vẻ như quá mức, xem câu trả lời của tôi dưới đây cho một giải pháp đơn giản hơn!
Qasim

81

Vâng, nó là phổ quát.

Mặc dù '\n'là các tự dòng mới phổ quát , bạn phải nhớ rằng, tùy thuộc vào đầu vào của bạn, các ký tự dòng mới có thể được đi trước bởi các ký tự trả về vận chuyển ( '\r').


55
\ n là ký tự nguồn cấp dữ liệu phổ quát (LF). Chuỗi byte dòng chính xác phụ thuộc vào nền tảng (\ r \ n, \ n hoặc \ r: en.wikipedia.org/wiki/Newline ). Và đó là câu hỏi Landon đang hỏi. Bạn đang mâu thuẫn với chính mình khi lần đầu tiên nói đó là nhân vật dòng mới phổ quát, và sau đó nói rằng nó có thể được đặt trước bởi CR. Đó là cái nào
Mercator

2
\ n là ký tự dòng mới (nguồn cấp dữ liệu), ngay cả khi nó được đi trước bởi giá trị vận chuyển. CR không bao giờ nên được sử dụng riêng, mặc dù hầu hết các ứng dụng và ứng dụng Windows sẽ phân tích nó như một dòng mới. LF cũng hoạt động tốt trong Windows. CR chỉ là một vật phẩm từ thời máy tính chỉ là máy chữ điện tử.
GolezTrol

3
@GolezTrol Có những lý do hợp lệ để tự mình sử dụng CR. Chẳng hạn, quay trở lại đầu dòng trong cửa sổ giao diện điều khiển để ghi đè lên dòng, mà không chuyển sang dòng tiếp theo. Điều này thường được sử dụng để viết các chỉ số tiến trình phần trăm thay đổi trong các tiện ích dòng lệnh.
Dan Bechard

2
@Dan Cảm ơn đã phản hồi. Tất nhiên, tôi không bao giờ nên nói "không bao giờ", vì thực sự có những ứng dụng cho CR. Nhưng câu hỏi là về Javascript chứ không phải về các tiện ích dòng lệnh. Tất nhiên, có thể có một tập lệnh chạy trong chế độ CLI (mặc dù tôi không biết CR có hoạt động như bạn đã nói không) và thậm chí bạn có thể sử dụng Javascript để tạo tập lệnh chạy trong dòng lệnh. Đó là những ngoại lệ có thể cho quy tắc, nhưng trong bối cảnh của câu hỏi dường như chúng không được áp dụng. Tuy nhiên, cảm ơn vì đã đề cập đến nó.
GolezTrol

65

Đừng sử dụng "\ n". Hãy thử điều này:

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

Chỉ cần nhập một dấu gạch chéo ngược và tiếp tục Truckin '! Hoạt động như một lá bùa.


ES6 cũng hỗ trợ các giá trị đa dòng với tildeký tự (nếu không được gọi là backtick).
Qasim

10
@Qasim - FYI, tôi tin rằng dấu ngã và backtick là những nhân vật khác nhau, xem ~Tilde vs `Backtick .
Chris Burgess

1
À - Yup, bạn nói đúng. ES6 sử dụng ký tự backtick cho chuỗi đa dòng
Qasim

2
Mặc dù hợp pháp, điều đó được tán thành trong các vòng tròn JS. Nó thiếu khả năng đọc. nếu bạn có thể, hãy sử dụng backticks của ES6. Nếu không, \ n
gotofritz

3
Khi viết mã này hoạt động. Dường như OP nói về việc phân tích văn bản từ một vùng văn bản.
jinglểula

53

Có thể dễ dàng nhất là chỉ xử lý tất cả các trường hợp của ký tự dòng mới thay vì kiểm tra trường hợp nào sau đó áp dụng nó. Ví dụ: nếu bạn cần thay thế dòng mới thì hãy làm như sau:

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

1
Tuyệt vời. Hoạt động tuyệt vời trong các phiên bản sau FF và IE (mặc dù chưa được thử nghiệm phiên bản cũ hơn)
EvilDr

25

có sử dụng \ n, trừ khi bạn đang tạo mã html, trong đó bạn muốn sử dụng <br />


13

Chức năng liên kết email tôi sử dụng "% 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>

Có ai biết loại mã này cho khóa tab không? tôi đã thử "% 0D% 09" nhưng không hoạt động.
Nilay

7

Nhận một dấu tách dòng cho trình duyệt hiện tại:

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

3
Thế còn return textarea.value;?
XP1

Sẽ sử dụng JSON.stringifytrên kết quả thay đổi nhân vật? Nếu tôi cố gắng xem kết quả trong một alert()cuộc gọi, nó sẽ không hiển thị cho tôi ký tự trừ khi tôi

4

Lưu ý - khi sử dụng ExtendScript JavaScript (ngôn ngữ Adobe Scripting được sử dụng trong các ứng dụng như Photoshop CS3 +), ký tự sẽ sử dụng là "\ r". "\ n" sẽ được hiểu là một ký tự phông chữ và do đó nhiều phông chữ sẽ có một ký tự khối thay thế.

Ví dụ: (để chọn một lớp có tên 'Lưu ý' và thêm nguồn cấp dữ liệu sau tất cả các giai đoạn):

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

Đã cố gắng tìm hiểu tại sao \n<br/>không làm việc trong tập lệnh Photoshop của tôi ... Cảm ơn!
Jake Stoeffler

3

Bạn có thể sử dụng `` ngoặc kép (nằm bên dưới nút Esc) với ES6. Vì vậy, bạn có thể viết một cái gì đó như thế này:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;

1

Tôi tin là vậy - khi bạn đang làm việc với các chuỗi JS.

Tuy nhiên, nếu bạn đang tạo HTML, bạn sẽ phải sử dụng <br />các thẻ (không \n, vì bạn không còn giao dịch với JS nữa)


1

Tôi gặp vấn đề trong việc thể hiện dòng mới với \ n hoặc \ r \ n .
Kỳ diệu nhân vật \ r được sử dụng để vận chuyển trở lại làm việc cho tôi như một dòng mới.
Vì vậy, trong một số trường hợp, cũng hữu ích khi xem xét \ r.


Điều này xảy ra nếu chuỗi của bạn có bộ ký tự 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

Bản in:

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

0

Một quan sát thực tế ... Trong tập lệnh NodeJS của tôi, tôi có chức năng sau:

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

Đầu tiên tôi chỉ có "\ n" nhưng tôi nhận thấy rằng khi tôi mở tệp nhật ký trong Notepad, nó sẽ hiển thị tất cả các mục trên cùng một dòng. Mặt khác, Notepad ++ hiển thị các mục trên mỗi dòng riêng của chúng. Sau khi thay đổi mã thành "\ r \ n", ngay cả Notepad cũng hiển thị mọi mục nhập trên dòng riêng của nó.


-3

Điều \nnày chỉ tốt cho tất cả các trường hợp tôi gặp phải. Tôi đang làm việc với web, sử dụng \nvà đừng lo lắng về điều đó (trừ khi bạn có bất kỳ vấn đề nào liên quan đến dòng mới).


-13

bạn có thể sử dụng <br/>document.write/, document.writelnmột.


4
Xin vui lòng đọc lại câu hỏi. Nó đặc biệt nói rằng anh ta không hỏi về<br>
Leigh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.