【问题标题】:What is the JavaScript string newline character?什么是 JavaScript 字符串换行符?
【发布时间】:2010-11-12 10:39:26
【问题描述】:

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

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

【问题讨论】:

  • 我有一个多行输入控件,用户需要输入一个换行符分隔的列表。我需要首先在换行符上拆分字符串来解析列表。
  • @landon9720:对于我的多行输入控件,我有一个 getValue 函数,它接受 value 并返回 value.replace(/\r\n/g,'\n') - 只是为了保持跨浏览器/平台的输出一致。
  • 好问题,特别是对于那些刚接触编程的人!在 HTML 和 JavaScript 之外,最好知道如何换行。

标签: javascript newline


【解决方案1】:

实际观察...在我的 Node.js 脚本中,我有以下功能:

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

首先,我只有“\n”,但我注意到当我在记事本中打开日志文件时,它会在同一行显示所有条目。另一方面,Notepad++ 将条目分别显示在自己的行上。将代码更改为“\r\n”后,即使记事本也将每个条目都显示在自己的行中。

【讨论】:

  • 大概在 Windows 上。
【解决方案2】:
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%.

【讨论】:

    【解决方案3】:

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

    var text = `fjskdfjslfjsl
    skfjslfkjsldfjslfjs
    jfsfkjslfsljs`;
    

    【讨论】:

    • 完美建议。
    • 在什么键盘布局上?什么特别的键盘?
    【解决方案4】:

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

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

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

    【讨论】:

    • ES6 还支持带有tilde 字符(也称为反引号)的多行值。
    • @Qasim - 仅供参考,我相信波浪号和反引号是不同的字符,请参阅 ~ Tilde` Backtick
    • 啊 - 是的,你是对的。 ES6 对多行字符串使用反引号
    • 虽然合法,但在 JS 圈子里是不被接受的。它缺乏可读性。如果可以,请使用 ES6 的反引号。如果没有,\n
    • 在编写代码时这是可行的。看起来 OP 是关于从 textarea 解析文本。
    【解决方案5】:

    您可以使用<br/>document.write/document.writeln 之一。

    【讨论】:

    • 请重新阅读问题。它明确表示他询问<br>
    【解决方案6】:

    在电子邮件链接功能中,我使用“%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>
    

    【讨论】:

    • 有人知道这种tab键的代码吗?我尝试了“%0D%09”但没有工作。
    【解决方案7】:

    \n 适用于我遇到的所有情况。如果您正在使用网络,请使用 \n 并且不用担心(除非您遇到任何与换行相关的问题)。

    【讨论】:

      【解决方案8】:

      我相信是 -- 当您使用 JavaScript 字符串时。

      但是,如果您要生成 HTML,则必须使用 &lt;br /&gt; 标签(而不是 \n,因为您不再使用 JavaScript)。

      【讨论】:

        【解决方案9】:

        是的,使用 \n,除非你正在生成 HTML 代码,在这种情况下你想使用&lt;br /&gt;

        【讨论】:

          【解决方案10】:

          我刚刚使用这个愚蠢的 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,&lt;form&gt;&lt;textarea name="foo"&gt;foo%0abar&lt;/textarea&gt;&lt;input type="submit"&gt;&lt;/form&gt; 并按下提交按钮。 (有些浏览器会阻止提交页面的加载,但可以在控制台中看到 URL 编码的表单值。)

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

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

          【讨论】:

          • 为我工作,但必须使用全局标志:/\r\n|\r|\n/g
          • @Edson 和错误的,因为它将 \r\n 视为两个换行符而不是一个。如果你想要简短,/\r?\n/g 可能会做(谁还在使用 Mac OS 9?)。
          • 鉴于 SitePoint 文章是 2004 年的,那里的信息可能与当前的 JS 实现无关。
          • Match 应该比 split 快得多:jsperf.com/regex-split-vs-match
          • 这似乎有点矫枉过正,请参阅下面的答案以获得更简单的解决方案!
          【解决方案11】:

          注意 - 在使用 ExtendScript JavaScript(Photoshop CS3+ 等应用程序中使用的 Adob​​e 脚本语言)时,要使用的字符是“\r”。 "\n" 将被解释为字体字符,因此许多字体将具有块字符。

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

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

          【讨论】:

          • 试图弄清楚为什么 \n&lt;br/&gt; 在我的 Photoshop 脚本中不起作用...谢谢!
          【解决方案12】:

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

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

          【讨论】:

          • return textarea.value; 怎么样?
          • 在结果上使用JSON.stringify会改变字符吗?如果我尝试在alert() 调用中查看结果,除非我先对其进行字符串化,否则它不会显示字符(当然,不是说字符需要人类可读才能有效)
          【解决方案13】:

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

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

          【讨论】:

          • 好极了。在更高版本的 FF 和 IE 中运行良好(但未测试旧版本)
          【解决方案14】:

          我遇到了用 \n\r\n 表示换行符的问题。
          神奇的是,用于回车的字符 \r 对我来说就像换行一样。
          所以在某些情况下,考虑 \r 也是有用的。

          【讨论】:

          • 如果您的字符串具有 ISO-8859-1 字符集,则会发生这种情况
          【解决方案15】:

          是的,它是通用的。

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

          【讨论】:

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