JavaScript字符串换行符?

Lan*_*uhn 407 javascript newline

\n在Javascript中所有平台的通用换行字符序列?如果没有,我如何确定当前环境的字符?

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

mer*_*tor 355

我刚刚使用这个愚蠢的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`);
Run Code Online (Sandbox Code Playgroud)
<textarea id="test" name="test">

</textarea>
Run Code Online (Sandbox Code Playgroud)

Windows上的IE8和Opera 9使用\r\n.我测试的所有其他浏览器(Windows上的Safari 4和Firefox 3.5以及Linux上的Firefox 3.0)都使用\n.\n虽然IE和Opera会在\r\n内部将其转换回来,但它们在设置值时都可以正常处理.有一个SitePoint文章,其中包含一些在Javascript中称为Line endings的更多细节.

还需要注意的是,这是独立于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);
Run Code Online (Sandbox Code Playgroud)

  • @Edson和错误,因为它将`\ r \n`视为两个换行而不是一个.如果你想要简短,`/\r?\n/g`可能会做(仍然使用Mac OS 9?). (17认同)
  • 为我工作,不得不使用全局标志:/\r \n |\r | \n/g (14认同)
  • / [\ r \n]/g更简单 (3认同)
  • 值得注意的是@mercator (2认同)

Sin*_*our 81

是的,这是普遍的.

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

  • \n是通用*换行*字符(LF).确切的换行字节序列取决于平台(\ r \n,\n或\ r:http://en.wikipedia.org/wiki/Newline).而*那是*landon提出的问题.当你第一次说它是普遍的换行符时,你就会自相矛盾,然后说它可能先于CR.哪一个? (52认同)
  • @GolezTrol有正当理由单独使用CR.例如,在控制台窗口中返回到行的开头以覆盖该行,而不移动到下一行.这通常用于在命令行实用程序中编写更改百分比进度指示器. (3认同)
  • \n是换行符(换行符),即使它前面有回车符.CR永远不应该单独使用,尽管大多数Windows apis和应用程序都会将其解析为换行符.LF也适用于Windows.CR只是计算机仅仅是电子打字机时的一件神器. (2认同)
  • @Dan感谢您的反馈.当然,我永远不应该说"从不",因为确实有一个CR的应用程序.但问题是关于Javascript而不是命令行实用程序.当然可能有一个以CLI模式运行的脚本(虽然我不知道CR是否会像你说的那样工作),你甚至可以使用Javascript生成一个在命令行中运行的脚本.这些可能是规则的例外,但在问题的背景下,它们似乎不适用.不过,谢谢你提到它. (2认同)

Qas*_*sim 61

不要使用\n,试试这个:

var string = "this\
is a multi\
line\
string";
Run Code Online (Sandbox Code Playgroud)

只需输入反斜杠并继续卡车'!奇迹般有效.

  • @Qasim - 仅供参考,我认为代字号和反引号是不同的字符,请参阅[`~`Tilde](https://en.wikipedia.org/wiki/Tilde)vs [````Backtick >>(https:// zh-CN .wikipedia.org /维基/ Grave_accent#Use_in_programming). (9认同)
  • 编写代码时,这是有效的.看起来OP似乎是关于从textarea解析文本. (3认同)
  • ES6 还支持带有“波浪号”字符(也称为反引号)的多行值。 (2认同)
  • 啊 - 是的,你是对的。ES6 对多行字符串使用反引号字符 (2认同)
  • 虽然合法,但在JS圈子里却不赞成.它缺乏可读性.如果可以,请使用ES6的反引号.如果没有,\n (2认同)

Qui*_*ncy 53

最简单的方法就是处理新行字符的所有情况,而不是检查应用它的情况.例如,如果您需要替换换行符,请执行以下操作:

htmlstring = stringContainingNewLines.replace(/(\r\n|\n|\r)/gm, "<br>");
Run Code Online (Sandbox Code Playgroud)


Fin*_*ner 24

是使用\n,除非您要生成要使用的html代码 <br />


ISC*_*SCI 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; 
} 
Run Code Online (Sandbox Code Playgroud)

[HTML]

<a href="#" onClick="sendMail()">Contact Us</a>
Run Code Online (Sandbox Code Playgroud)


Vit*_*nko 6

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

function getLineSeparator() {
  var textarea = document.createElement("textarea");
  textarea.value = "\n"; 
  return textarea.value;
}
Run Code Online (Sandbox Code Playgroud)

  • 怎么样`return textarea.value;`? (3认同)

Bog*_*rai 6

您可以在 ES6 中使用 `` 引号(位于 Esc 按钮下方)。所以你可以这样写:

var text = `fjskdfjslfjsl
skfjslfkjsldfjslfjs
jfsfkjslfsljs`;
Run Code Online (Sandbox Code Playgroud)