System.Environment.NewLine和\n的区别

10

使用Visual Studio 2010和C#

这个方法在很多年里一直起作用...

 string myString= txtSomeMultiLineTextBox.Text;
 string str = myString.Replace(System.Environment.Newline, "<br />");

设置断点时,如果myString = LineOne\nLineTwo\nLineThree
那么 \n 不会被替换...
然后 str = myString
没有替换。
myString 保持不变。


我已经在各处进行了关于 Environment.Newline 的研究,并且与操作环境的差异,我使用的操作环境是 Windows 7。
这个 Environment 不会改变。
为什么 Environment.Newline 没有读取 \n?

谢谢。


1
如果你想确保替换掉所有的换行符,无论是回车符和换行符配对,还是单独的换行符,请尝试这样做:string str = myString.Replace("\r\n", "<br />").Replace("\n", "<br />"); - jmcilhinney
1
或者使用正则表达式:Regex.Replace(input, "\r?\n", "\n"); - Jim Mischel
2
通常只有在写文件或输出到控制台时才使用 Environment.NewLine。在读取时,应使用不变的内容。 - Dai
3个回答

15

考虑到你给这个问题打上了asp.net的标签,我会假设txtSomeMultiLineTextBox最终是一个TextArea

TextArea返回的文本由特定浏览器版本决定分隔符,可能是\n或者\r\n。(IE过去总是使用\r\n,现在改为使用\n,很奇怪但却是真实情况。)

所以也许之前可以工作的原因是你在较早版本的IE上进行测试,而那时使用的是\r\n作为新行的分隔符,而现在你可能正在使用IE 10、11或Chrome,\n被用作新行的分隔符。

因此,为了能够兼容两种情况,请这样做:

myString.Replace("\r\n", "\n").Replace("\n", "<br />");

为了彻底澄清这一点:

不要指望Environment.NewLine可以为您解决这个问题。

如果您的环境是Windows,则没有一个单一的、在Microsoft产品中使用的统一的新行符号。最好准备好自己规范行尾。


你是对的。我在旧浏览器上进行了一些测试,它的表现就像我预期的那样。感谢其他人的答复......对于我们回顾十多年的编程来说,这是一个有趣的话题! - Zath

5

由于Environment.NewLine依赖于平台。

Environment.NewLine在非Unix(...Windows)平台上是\r\n。这是回车和换行符。

如果您的字符串只包含\n..则无法替换\r\n..因为该组不在那里。

作为测试,只需替换\n..:

string myString= txtSomeMultiLineTextBox.Text;
string str = myString.Replace("\n", "<br />");

是的,我考虑过这个问题,但我喜欢开发以防万一有其他系统/浏览器等。问题仍然是,为什么? - Zath
1
为什么会这样?为什么它无法读取 \n?因为在 Windows 中 Environment.NewLine 不是 \n,而是 \r\n 组合。 - Simon Whitehead

2
这是因为 System.Environment.Newline 由回车和换行符组成,即 "\r\n",所以它不仅匹配 `"\n"`。

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