JavaScript跨平台换行符

34

在JavaScript中是否存在类似于Java的System.getProperty("line.separator");的功能?

注:我正在使用非浏览器JavaScript环境Node.js。


1
可能是如何在JavaScript中确定操作系统路径分隔符?的重复问题。 - Ciro Santilli OurBigBook.com
1
路径分隔符可以是冒号或分号。它与换行符不是同一件事。请参阅 https://dev59.com/1m025IYBdhLWcg3wfmHw。 - Stephen Ostermiller
路径分隔符可以是斜杠或反斜杠。但行分隔符可以是“\n”、“\r\n”或“\r”。因此不会重复。 - boris1993
6个回答

47

我曾遇到同样的问题,并看到这个相当古老的问题。经过一段时间的研究,我最终在os文档的末尾找到了os.EOL

var os = require('os')
console.log(JSON.stringify(os.EOL)) // prints "\n" on my Mac

JSON.stringify在这种情况下很重要,否则您将只在控制台中看到一个空行(这是有意义的,因为这是它应该做的)。在正常使用情况下,它是不必要的。


1
不知道我提问时是否已经有这个答案了,但现在看来这肯定是正确的答案。感谢你的帮助! - tdashroy
2
@tdashroy 我想补充一下答案,如果你正在处理不一定来自同一操作系统的文件,你可以在大多数文本操作函数中使用正则表达式,例如 String.split()String.replace() 等等... 为此,请使用 /\r\n|\n/ - user1598585

19

按照标准来说,不是定义的。 第7.3节 定义了 JavaScript 程序源代码的行终止符(有四个),但与平台上文本行终止符的定义无关。

如果您谈论的是非浏览器环境(shell 脚本、基于服务器的 JavaScript 等等),建议查看运行环境(NodeJS、Rhino 等)的文档,这些文档将会为您提供相关的环境信息。(在 Rhino 中,您可以使用 Java 的信息。)

如果您谈论的是基于浏览器的环境,通常情况下,使用 \n,但正是这种“通常情况下”可能会让您遇到问题。 :-) 一些浏览器甚至会在 JavaScript 接收到它们之前转换行尾,例如在 textarea 中。例如,此页面 的原始版本中根本没有回车符。但是,如果您在 Internet Explorer 中运行该页面,请注意它在文本区域的值中发现了 \r 字符。Chrome 和 Firefox 不会这样做(即使在 Windows 上运行时也是如此),但 Opera 也会添加它们(即使在 *nix 上运行时也是如此)。因此,在访问多行字段值时,我倾向于“标准化”行尾符,通过str = str.replace(/(?:\r\n|\r)+/g, "\n");实现,以防万一。(这假定独立的 \r 和后跟 \n\r 都应该是换行符;较旧的 Mac 上只使用 \r。)

继续涉及浏览器方面的问题,由于不同浏览器甚至在同一操作系统上执行不同的操作,是否有办法知道它们使用的是什么?是的,有一个诡计可以找出:

function getLineBreakSequence() {
    var div, ta, text;

    div = document.createElement("div");
    div.innerHTML = "<textarea>one\ntwo</textarea>";
    ta = div.firstChild;
    text = ta.value;
    return text.indexOf("\r") >= 0 ? "\r\n" : "\n";
}
这段代码之所以管用是因为使用了\r\n的浏览器在解析HTML字符串时会即时转换\n。你可以使用你喜欢的浏览器尝试这个在线运行副本
更新:啊,你正在使用NodeJS。可惜的是,就像你一样,我在NodeJS文档中没有看到任何关于此的信息。NodeJS与C/C++密切相关,在C/C++中,无论操作系统如何,你都可以使用\n进行换行-在以文本模式打开的流上,它会在读取和写入时即时转换为特定于操作系统的版本。但我没有看到NodeJS对文本模式文件流的任何支持。 fs.open函数没有记录来自fopenb标志(否则将从那里获取该标志的语法),如果你查看源代码,则在MinGW上它将_fmode设置为_O_BINARY。所有这些都让我怀疑文件始终处于二进制模式。 console.log的实现使用\n进行换行,至于有什么作用,则不得而知。

啊,我应该澄清一下,我确实是在谈论一个非浏览器环境。我正在使用NodeJS。我会尝试查找相关文档,这个想法之前没有想到过(如果你还没发现,我是新手)。除此之外,感谢您提供的所有有用信息! - tdashroy
很棒的回答!+2 按钮在哪里? - Sean Vieira
我在文档中找不到任何相关信息,所以看起来答案是否定的(或者我没有找对地方)。感谢您的帮助! - tdashroy

12

一些浏览器使用\n,而一些使用\r\n。如果你想将文本按换行符拆分,只需使用以下代码:

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

1
不是的。在正则表达式中有换行符(\n)和回车符(\r),但没有像“line.separator”属性这样的东西。如果我们谈论客户端js的话。

0

这个问题最好在...等等...StackOverflow上回答!其中问题包括一个函数来确定换行符,而此处提供的答案提供了一种检测平台的方法,然后推断出用于pre或textarea中的平台敏感换行符。

在浏览器中,如何确定适合操作系统的换行符口味?

此外,您可以在此处找到一个很好的解释:http://www.bennadel.com/blog/161-Ask-Ben-Javascript-Replace-And-Multiple-Lines-Line-Breaks.htm,在pre和textarea之外,JavaScipt将所有行分隔符转换为\n


抱歉,我应该澄清一下(我在上面进行了编辑)。我正在使用称为Node.js的非浏览器JavaScript环境。 - tdashroy

0

这对我有用(尽管我是先偶然发现了这个问题)。

JavaScript 平台无关的换行符

function getLineBreakSequence() {
    var div, ta, text;

    div = document.createElement("div");
    div.innerHTML = "<textarea>one\ntwo</textarea>";
    ta = div.firstChild;
    text = ta.value;
    return text.indexOf("\r") >= 0 ? "\r\n" : "\n";
}

那个问题关注于Node.js的使用,但那个答案很好地描述了跨浏览器和跨平台的情况。


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