JavaScript字符串的换行符是什么?

502

\n 是 JavaScript 中的通用换行符序列吗?如果不是,我该如何确定当前环境所使用的字符?

我不是在问 HTML 的换行元素 (<BR/>)。我询问的是 JavaScript 字符串中使用的换行字符序列。


7
我有一个多行输入控件,用户需要输入一个以换行符分隔的列表。我需要首先通过在换行符上拆分字符串来解析该列表。 - Landon Kuhn
8
我有一个多行输入控件,它有一个名为getValue的函数,接受value并返回value.replace(/\r\n/g,'\n'),只是为了使输出在不同浏览器/平台上保持一致。 - Roy Tinker
1
这是一个很好的问题,特别适合新手程序员!除了HTML之外,在JavaScript中了解如何换到下一行是很有必要的。 - Eric Bishard
请查看 https://www.npmjs.com/package/eol。 - ryanve
我已在控制台中使用过此代码,并获得了2个不同的结果。 var a = "你好"; var b = "世界"; 当我尝试像这样显示它时 a + "\n" + b; 它会输出 你好\n世界; 但如果我将其放入控制台中,如下所示 console.log(a + "\n" + b); 它会输出 你好和世界在2行中。 - Ajish Kumar
15个回答

396

我刚刚使用这个简单的 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>

在Windows上,IE8和Opera 9使用\r\n。我测试的所有其他浏览器(Windows上的Safari 4和Firefox 3.5以及Linux上的Firefox 3.0)都使用\n。当设置值时,它们都可以很好地处理\n,尽管IE和Opera会将其再次转换为\r\n。有一篇名为Line endings in Javascript的SitePoint文章提供了更多细节。

还要注意,这与HTML文件本身中的实际换行符无关(\n\r\n都会产生相同的结果)。

在提交表单时,所有浏览器都将换行符规范化为URL编码中的%0D%0A。要查看,请加载例如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
20
如果使用@Edson的方法会出现问题,因为它将\r\n视为两个换行符而不是一个。如果你想简短一些,/\r?\n/g可能就可以了(毕竟谁还在用Mac OS 9呢?)。 - mercator
1
考虑到SitePoint文章的发布时间是在2004年,里面的内容可能与当前的JS实现不相符。 - cbmanica
1
Match 比 Split 快得多:http://jsperf.com/regex-split-vs-match - Wilt
这是否意味着在不同的浏览器/系统中,使用 CRLFCR 进行换行会导致字符串长度不同? - Ilya Loskutov

94

是的,它是通用的。

虽然'\n'是通用的换行符字符,但您必须记住,根据您的输入,换行符可能会在回车符('\r')之前出现。


65
"换行符"是通用的字符(LF)。确切的换行字节序列取决于平台(\r\n、\n或\r:http://en.wikipedia.org/wiki/Newline)。这就是Landon在问的问题。当你先说它是通用换行符,然后又说它可能会带有CR时,你自相矛盾了。那么它到底是哪一个呢? - mercator
2
“\n”是换行(换行符)字符,即使它前面有回车符也是如此。不应该单独使用CR,尽管大多数Windows API和应用程序将其解析为换行符。LF在Windows中同样有效。CR只是计算机仅仅是电子打字机时代的产物。 - GolezTrol
4
@GolezTrol,单独使用CR是有合理的原因的。例如,在控制台窗口中返回到行的开头以覆盖该行,而不转到下一行。这经常用于在命令行实用程序中编写变化的百分比进度指示器。 - Dan Bechard
3
谢谢反馈,当然,我不应该说“从不”,因为确实可以只使用CR。但问题是关于Javascript而不是关于命令行实用程序。当然,可能有一个在CLI模式下运行的脚本(尽管我不知道CR是否会像你说的那样工作),甚至您可能使用Javascript生成在命令行中运行的脚本。这些是规则的可能例外,在问题的上下文中它们似乎不适用。尽管如此,感谢提及。 - GolezTrol
preceded => 先于或后继 - sergiol

76

不要使用"\n"。试试这个:

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

只需输入反斜杠并继续前进!它像魔法一样有效。


2
ES6还支持使用“波浪号”字符(也称为反引号)来表示多行值。 - Qasim
20
@Qasim - 我想告诉你,波浪号和反引号是不同的字符,可以参考波浪线反引号. - Chris Burgess
1
啊 - 是的,你说得对。ES6使用反引号字符来表示多行字符串。 - Qasim
4
虽然在JS圈子里这是合法的,但它并不受欢迎。这样做会降低代码的可读性。如果可以的话,请使用ES6的反引号(backticks)。如果不行,使用\n。 - gotofritz
"this\" 真的比 "this\n" 更不易读吗?如果你问我,这相当主观... 我喜欢在任何可以的地方节省一个字符(和按键)。开发者都是懒惰的 :) - Qasim
7
写代码时这样做是有效的。不过看起来OP讨论的是从文本区解析文本的问题。 - jinglesthula

61

处理换行符的最简单方法可能是统一处理所有情况,而不是检查哪种情况然后应用它。例如,如果需要替换换行符,则可以执行以下操作:

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

1
非常好。在较新版本的FF和IE中运行良好(尚未测试旧版本)。 - EvilDr

28

如果你在编写HTML代码,那么使用<br />,否则请使用\n。


16

在一个邮件链接函数中,我使用了"%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”,但不起作用。 - Nilay Mehta

14

使用ES6,您可以使用反引号(``),它位于任何大小为75%或更大的美国布局键盘上方的Esc按钮下面。因此,您可以编写类似于以下内容的内容:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;

1
完美建议。 - Metehan Gülaç
在哪种键盘布局下?是哪个特定的键盘? - Peter Mortensen
@PeterMortensen 反引号的 ASCII 代码是96,因此您可以通过按下键盘上的Alt+96来输入它。在美国键盘布局中,它位于Esc和Tab之间。在匈牙利布局中,它位于AltGr+7上。 - CLS

8

获取当前浏览器的行分隔符:

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

3
return textarea.value; 的翻译是什么? - XP1
使用JSON.stringify会改变结果中的字符吗?如果我尝试在alert()调用中查看结果,除非我先将其字符串化,否则它不会显示给我(当然,字符不需要可读性才能有效)。 - user890167

4

注意 - 在使用ExtendScript JavaScript(像Photoshop CS3+这样的Adobe脚本语言)时,应该使用"\r"字符。 "\n"将被解释为字体字符,因此许多字体将使用块字符代替。

例如(选择名为'Note'的图层并在所有句点后添加换行符):

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

一直在尝试弄清楚为什么\n<br/>在我的Photoshop脚本中无法正常工作...谢谢! - Jake Stoeffler

3
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%.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接