在JavaScript中是否存在类似于Java的System.getProperty("line.separator");
的功能?
注:我正在使用非浏览器JavaScript环境Node.js。
在JavaScript中是否存在类似于Java的System.getProperty("line.separator");
的功能?
注:我正在使用非浏览器JavaScript环境Node.js。
我曾遇到同样的问题,并看到这个相当古老的问题。经过一段时间的研究,我最终在os文档的末尾找到了os.EOL
。
var os = require('os')
console.log(JSON.stringify(os.EOL)) // prints "\n" on my Mac
JSON.stringify
在这种情况下很重要,否则您将只在控制台中看到一个空行(这是有意义的,因为这是它应该做的)。在正常使用情况下,它是不必要的。
String.split()
、String.replace()
等等... 为此,请使用 /\r\n|\n/
。 - user1598585按照标准来说,不是定义的。 第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
。你可以使用你喜欢的浏览器尝试这个在线运行副本。
\n
进行换行-在以文本模式打开的流上,它会在读取和写入时即时转换为特定于操作系统的版本。但我没有看到NodeJS对文本模式文件流的任何支持。 fs.open
函数没有记录来自fopen
的b
标志(否则将从那里获取该标志的语法),如果你查看源代码,则在MinGW上它将_fmode
设置为_O_BINARY
。所有这些都让我怀疑文件始终处于二进制模式。 console.log
的实现使用\n
进行换行,至于有什么作用,则不得而知。一些浏览器使用\n
,而一些使用\r\n
。如果你想将文本按换行符拆分,只需使用以下代码:
lines = foo.value.split(/\r\n|\r|\n/);
这个问题最好在...等等...StackOverflow上回答!其中问题包括一个函数来确定换行符,而此处提供的答案提供了一种检测平台的方法,然后推断出用于pre或textarea中的平台敏感换行符。
此外,您可以在此处找到一个很好的解释:http://www.bennadel.com/blog/161-Ask-Ben-Javascript-Replace-And-Multiple-Lines-Line-Breaks.htm,在pre和textarea之外,JavaScipt将所有行分隔符转换为\n
。
这对我有用(尽管我是先偶然发现了这个问题)。
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的使用,但那个答案很好地描述了跨浏览器和跨平台的情况。