什么是 JavaScript 字符串换行符?

IT技术 javascript newline
2021-01-27 05:11:29

\nJavaScript 中的通用换行符序列是否适用于所有平台?如果不是,我如何确定当前环境的角色?

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

6个回答

我刚刚使用这个愚蠢的 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内部再次将其转换回有一篇 SitePoint 文章,其中包含更多详细信息,称为Javascript 中的行结尾

还需要注意的是,这是独立于HTML文件本身的实际行结尾的(都\n\r\n给出相同的结果)。

提交表单时,所有浏览器都将换行符规范化为%0D%0AURL 编码。要看到这一点,加载例如data:text/html,<form><textarea name="foo">foo%0abar</textarea><input type="submit"></form>并按下提交按钮。(有些浏览器会阻止加载提交的页面,但您可以在控制台中看到 URL 编码的表单值。)

不过,我认为你真的不需要做太多的决定。如果您只想在换行符上拆分文本,您可以执行以下操作:

lines = foo.value.split(/\r\n|\r|\n/g);
为我工作,但不得不使用全局标志:/\r\n|\r|\n/g
2021-03-12 05:11:29
这似乎有点矫枉过正,请参阅下面的答案以获取更简单的解决方案!
2021-03-14 05:11:29
匹配比拆分快得多:jsperf.com/regex-split-vs-match
2021-03-27 05:11:29
鉴于 SitePoint 文章来自 2004 年,其中的信息可能与当前的 JS 实现无关。
2021-04-05 05:11:29
@Edson 错了,因为它将被\r\n视为两个换行符而不是一个。如果你想要简短,/\r?\n/g可能会做(谁还在使用 Mac OS 9?)。
2021-04-08 05:11:29

是的,它是通用的。

尽管'\n'是通用换行符,但您必须记住,根据您的输入,换行符前面可能有回车符 ( '\r')。

\n 是换行(换行)字符,即使它前面有一个回车。CR 不应单独使用,尽管大多数 Windows api 和应用程序会将其解析为换行符。LF 在 Windows 中也能正常工作。CR 只是计算机还只是电子打字机时代的产物。
2021-03-12 05:11:29
\n 是通用换行符(LF)。确切的换行字节序列取决于平台(\r\n、\n 或 \r: en.wikipedia.org/wiki/Newline)。就是landon 要问的问题。当您首先说它是通用换行符,然后说它前面可能有 CR 时,您是在自相矛盾。哪一个?
2021-03-17 05:11:29
@Dan 感谢您的反馈。当然,我永远不应该说“从不”,因为确实有 CR 本身的申请。但问题是关于 Javascript 而不是命令行实用程序。当然可能有一个脚本在 CLI 模式下运行(虽然我不知道 CR 是否会像你说的那样工作),你甚至可以使用 Javascript 生成一个在命令行中运行的脚本。这些是规则的可能例外,但在问题的背景下,它们似乎不适用。不过,感谢您提到它。
2021-03-20 05:11:29
@GolezTrol 有充分的理由单独使用 CR。例如,返回到控制台窗口中的行首以覆盖该行,而不移动到下一行。这通常用于在命令行实用程序中编写不断变化的百分比进度指示器。
2021-03-26 05:11:29

不要使用“\n”。试试这个:

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

只需输入一个反斜杠并继续运输!它就像一个魅力。

@Qasim -仅供参考,我相信波浪和反引号是不同的字符,看~波浪号VS`反引号
2021-03-15 05:11:29
ES6 还支持带有tilde字符的多行值(也称为反引号)。
2021-03-18 05:11:29
啊 - 是的,你说得对。ES6 对多行字符串使用反引号字符
2021-03-23 05:11:29
在编写代码时,这有效。看起来 OP 是关于从 textarea 解析文本的。
2021-03-29 05:11:29
虽然合法,但在 JS 圈子里是不受欢迎的。它缺乏可读性。如果可以,请使用 ES6 的反引号。如果没有,\n
2021-03-31 05:11:29

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

htmlstring = stringContainingNewLines.replace(/(\r\n|\n|\r)/gm, "<br>");
高超。在更高版本的 FF 和 IE 中效果很好(虽然没有测试旧版本)
2021-03-11 05:11:29

是的,使用 \n,除非您要生成 HTML 代码,在这种情况下您想使用<br />.