回车和换行...在 C# 中都需要吗?
Posted
技术标签:
【中文标题】回车和换行...在 C# 中都需要吗?【英文标题】:Carriage return and Line feed... Are both required in C#? 【发布时间】:2011-07-10 19:21:08 【问题描述】:在字符串中插入换行符时,我通常会这样做:
str = "First line\nSecond line";
在 C# 中,这是标准做法吗?我还应该包括“回车”字符“\r”吗?以下是否有区别,如果有,它们是什么?
str = "First line\nSecond line";
str = "First line\r\nSecond line";
如果同时使用“回车”和“换行”是标准做法,是否有特定的顺序?为什么?
注意:我阅读了其他一些关于 SO 的帖子,但没有找到特定于 .NET/C# 的答案。
编辑:在测试了一个小应用程序后,我没有发现 '\n' 和 '\n\r' 或 '\r\n' 之间有任何区别。
【问题讨论】:
自己看看:用 C# 编写一个控制台应用程序并输出字符串,看看会发生什么。总的来说,我认为这与 C# 的关系不大,而与 Windows 的关系更大。 您在哪些平台上进行了测试?视窗?苹果? Linux?手机? 我在 Windows 上工作,所以也许这可以解释它。老实说,这个问题主要是试图找出原因以及最佳实践是什么。似乎在 .NET 中我应该总是使用 Environment.NewLine 常量。 这取决于你打算对字符串做什么。例如,如果您的字符串表示电子邮件标题,则它必须以 CR 结尾,后跟 LF。为什么?这就是规范定义标题终止符的方式。 【参考方案1】:这总是一个好主意,虽然它并不总是必需的,但 Windows 标准将两者都包括在内。
\n 实际上代表一个换行,或数字 10,并且在规范上,换行意味着在终端和电传打字机上“向下移动一行”。
\r 代表 CR、回车或数字 13。在 Windows、Unix 和大多数终端上,CR 将光标移动到行首。 (对于 8 位计算机,情况并非如此:其中大多数确实会通过 CR 进入下一行。)
无论如何,某些进程(例如文本控制台)可能会在您发送 LF 时自动添加 CR。但是,由于 CR 只是移动到行首,因此发送 CR 两次也无妨。
另一方面,对话框、文本框和其他显示元素需要 CR 和 LF 才能正确开始新行。
由于两者都发送确实没有坏处,而且在某些情况下两者都需要,因此最简单的策略是同时使用两者,如果您不确定的话。
【讨论】:
【参考方案2】:我知道这有点老了,但任何偶然发现此页面的人都应该知道 \n 和 \r\n 之间存在区别。
\r\n 给出 CRLF 行尾,\n 给出 LF 行尾字符。总的来说,眼睛差别很小。
从字符串创建一个.txt,然后尝试在记事本中打开(正常不是记事本++),你会发现不同
SHA,PCT,PRACTICE,BNF CODE,BNF NAME,ITEMS,NIC,ACT COST,QUANTITY,PERIOD
Q44,01C,N81002,0101021B0AAALAL,Sod Algin/Pot Bicarb_Susp S/F,3,20.48,19.05,2000,201901
Q44,01C,N81002,0101021B0AAAPAP,Sod Alginate/Pot Bicarb_Tab Chble 500mg,1,3.07,2.86,60,201901
上面是使用'CRLF',下面是'LF only'的样子(LF显示的地方有一个字符看不到)。
SHA,PCT,PRACTICE,BNF CODE,BNF NAME,ITEMS,NIC,ACT COST,QUANTITY,PERIODQ44,01C,N81002,0101021B0AAALAL,Sod Algin/Pot Bicarb_Susp S/F,3,20.48,19.05,2000,201901Q44,01C,N81002,0101021B0AAAPAP,Sod Alginate/Pot Bicarb_Tab Chble 500mg,1,3.07,2.86,60,201901
如果需要更正行尾且文件足够小,您可以在 NotePad++ 中更改行尾(或粘贴到 word 中,然后再粘贴回记事本 - 尽管这只会生成 CRLF)。
这可能会导致读取这些文件的某些函数可能不再起作用(给出的示例行来自 GP Prescribing data - England。文件已从 CRLF 行结尾更改为 LF 行结尾)。这停止了 SSIS 作业的运行,并且由于无法读取 LF 行结尾而失败。
行尾信息来源: https://en.wikipedia.org/wiki/Newline#Representations_in_different_character_encoding_specifications
希望这对将来的某人有所帮助:) CRLF = 基于 Windows,LF 或 CF 来自基于 Unix 的系统(Linux、MacOS 等)
【讨论】:
【参考方案3】:System.Environment.NewLine
是您正在寻找的常量 - http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx 它将提供特定于环境的组合,给定操作系统上的大多数程序将考虑“下一行文本”。
在实践中,大多数文本工具将包含\n
的所有变体视为“新行”,您可以在文本"foo\nbar"
中使用它。特别是如果您尝试构建像$"V1 = value1\nV2 = value2\n"
这样的多行格式字符串。如果您使用字符串连接构建文本,请考虑使用NewLine
。在任何情况下,请确保您使用的工具以您想要的方式理解输出,例如,如果您选择的编辑器无法正确打开文件,您可能需要始终使用\r\n
,而不考虑平台。
请注意,WriteLine
方法使用 NewLine
,因此如果您打算使用其中一种方法编写文本,请避免仅使用 \n
,因为结果文本可能包含 \r\n
和仅 \n
的混合,这可能会使某些工具感到困惑而且绝对看起来不整洁。
历史背景见Difference between \n and \r?
【讨论】:
我知道这个常量存在,但这是否意味着应该避免使用 \n \r 字符?如果是,为什么? @jonezy - 我不认为这是正确的;Environment.Newline
是整个可执行文件的常量(请参阅msdn)。您能否提供一个链接来解释该值是如何基于上下文的?【参考方案4】:
回车\r
将光标移动到当前行的开头。换行符\n
会导致下降到下一行,可能是下一行的开头;这就是 Alexei 上面提到的平台相关部分(在 *nix 系统上 \n
给你一个回车和一个换行符,在 Windows 中它没有)
你使用什么取决于你想要做什么。例如,如果我想在控制台上做一些旋转的东西,我会做str = "|\r/\r-\r\\\r";
。
【讨论】:
控制台上的旋转是我正在寻找的技巧。谢谢。【参考方案5】:这取决于您在哪里显示文本。例如,在控制台或文本框上,\n 就足够了。在 RichTextBox 上,我认为您需要两者。
【讨论】:
以上是关于回车和换行...在 C# 中都需要吗?的主要内容,如果未能解决你的问题,请参考以下文章