确定文本文件中使用的换行符是什么

12

在 C# 中,最好的方法是确定文本文件中使用的行尾符(Unix、Windows、Mac)是什么?


2
请注意,对于Unicode文件,有许多不同的字符被认为是合法的行终止符。它们包括:回车符(U+000D)、换行符(U+000A)、回车符(U+000D)后跟换行符(U+000A)、行分隔符(U+2028)和段落分隔符(U+2029)。有时还会有一个“文本结束”(U+0003)字符,可以合法地用作文件的最后一行的终止符。 - LBushkin
很多文件甚至混合了几种类型(HL7,我在看你)。 - Joel Coehoorn
7个回答

16

请注意,文本文件可能具有不一致的换行符。你的程序不应因此而出错。使用StreamReader(和类似方法)上的ReadLine将自动处理任何可能的行结尾。

如果您手动从文件中读取行,请确保接受任何行结尾,即使不一致。实际上,使用以下算法相当容易:

  • 向前扫描直到找到CR或LF。
  • 如果读到CR,请向前查看下一个字符;
  • 如果下一个字符是LF,则消耗它(否则,将其放回)。

3
这里有一些高级猜测:读取文件,计算CR和LF的数量。
if (CR > LF*2) then "Mac" 
else if (LF > CR*2) then "Unix"
else "Windows"

请注意,较新的Mac(Mac OS X)使用Unix换行符。

2

我会先搜索文件中第一个出现的\r\n,如果是\n,我会查看前面一个字符是否为\r,如果是,那么它就是\r\n,否则就是找到的任意一个。


5
如果你在文件中搜索第一个\r\n,那么你就知道前面的字符不是这两个中的任意一个。我认为你的意思是看下一个字符(以确定是否为\r\n对)。 - ToolmakerSteve

0

有一个Environment.NewLine,但那只是用于确定当前系统上使用的内容,并不能帮助从各种来源读取文件。

如果是读取,我通常会寻找\n(编辑:显然有一些人仅使用\r),并假设该行在那里结束。


2
嗯,我会调换一下你的段落顺序——第二段是一个答案——不确定 Environment.NewLine 是否非常相关。 - STW
据我所见,问题中没有提到这是用于从各种来源读取还是写入多个目标,并且当时标签只是C#。如果问题涉及在其他平台(例如mono等)上“正确”编写,则认为Environment.NewLine很有用。无论如何,我没有花太多时间考虑段落的顺序。 - Don

0

我想你无法确定,必须在编辑器中设置。你可以使用一些人工智能,算法如下:

  1. 搜索每种类型的行尾,您将搜索这些特定字符
  2. 测量它们之间的距离。
  3. 如果一种类型倾向于重复,则假定那是该类型。计算重复次数并使用某种离散度量。

例如,如果您有CRLF的重复出现在38、40、45处,并且在公差范围内,您将默认假定行尾为CRLF。


0
如果是我,我会一次读取一个字符,直到遇到第一个\r\n。这是假设您有合理的输入。

0
通常在读取大多数文本格式时,我会寻找换行符“\n”,然后修整整个字符串(开头和结尾的空格通常是冗余的)。

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