所有操作系统通用的换行符是什么?(LF和CR)

22
当我用Delphi在Windows机器上写文件时,生成的文本文件在Windows上工作得很好。但是当我在Mac上使用它时,格式要求略有不同。在Mac上,换行符不同,它不能总是读取Windows文件。
如何使我的文件可被Mac程序读取?

当您打开文件时,是否看到了^M字符?只是好奇。我记得在《经典Shell脚本编程》中读到过这方面的内容。我很想知道答案是什么。抱歉没有太多帮助 :-) 我认为您需要编写一个shell脚本,在Mac上打开文件之前清除这个字符。 - mledbetter
在 Mac 上的目标是什么?也就是说,你正在创建的文件将由什么打开? - dawg
如果您看到这个,通常意味着三件事是真实的:首先,您正在查看Windows或旧的Mac文本文件。其次,您的编辑器处于Linux或新的Mac模式。第三,您的编辑器用插入符号后跟非控制字符来显示控制字符。 - Rob Kennedy
2
根据深思熟虑,答案是“42”。 - mjn
@mjustin,啊...星号字符。所有的一切都加起来了。 - riwalk
6个回答

45
  • 对于Windows系统,使用CRLF换行符。
  • 对于UNIX系统,使用LF换行符。
  • 对于MAC(版本9及以下),使用CR换行符。
  • 对于MAC OS X系统,使用LF换行符。

事实上,不同的操作系统使用的换行符是不一样的。并不存在所谓的“通用”换行符。最好的方法是了解这些差异。


5
唯一的“通用”换行符事实是LFCR不存在。这个事实可以被滥用来处理来自所有三种操作系统的文件:首先检查它是否为LF,否则如果它是CR,则检查下一个字符是否是LF。 - slebetman
1
几乎正确 - 但是有些系统不使用CR或LF的任何组合作为行尾。当然,有些系统使用EBCDIC和其他非ASCII相关字符集。我相信甚至有一些系统(也许有人可以确认?)使用ASCII,但对于文本文件使用更复杂的数据结构,因此根本没有行尾字符。 - user180247
3
+1 表示没有通用的方法;你应该提到 http://en.wikipedia.org/wiki/Newline,因为除了你提到的 4 个示例外,还有更多的换行符。 - Jeroen Wiert Pluimers
请注意Mac上较旧版本的Excel(甚至可能是当前版本 - 但我正在使用Office 2011),因为我认为它使用Windows行尾,而不是OS X,如果您尝试通过脚本处理这些文件,可能会有点混乱。 - Dunk

8

不同操作系统的换行符并不统一。有些需要使用linefeed,有些需要使用carriage return,而有些则需要同时使用两者。

大多数文本编辑器都可以处理多种行尾符,请查看相关文档。此外,还有许多实用工具可以为您转换行尾符。


5
在系统单元中,有一个名为DefaultTextLineBreakStyle的全局变量,其值基于操作系统而定。它可以是tlbsLF或tlbsCRLF。 如果它是tlbsLF,则使用#10,如果它是tlbsCRLF,则使用#13 #10。
type
  TTextLineBreakStyle = (tlbsLF, tlbsCRLF);

var   { Text output line break handling.  Default value for all text files }
  DefaultTextLineBreakStyle: TTextLineBreakStyle = 
  {$IFDEF LINUX} tlbsLF {$ENDIF}
  {$IFDEF MSWINDOWS} tlbsCRLF {$ENDIF}
  {$IFDEF MACOS} tlbsLF {$ENDIF};

我只是想知道为什么它是一个var而不是一个const。


2
同时在 System 单元中,有一个 sLineBreak 常数,它被定义为 {$IFDEF LINUX} #10 {$ENDIF} {$IFDEF MSWINDOWS} #13#10 {$ENDIF}。 - Alan Clark
3
这是一个变量,可以编写Linux程序来处理Windows文本文件,例如:只需给该变量赋一个新值,其他所有内容都会正常工作。 - Rob Kennedy

2

2

与其使用“通用换行符”,不如编写一个“通用格式”,例如JSONXML、PDF等,具体取决于输出内容是作为另一个程序的数据还是要供人类阅读的报告文档。


1

非常古老的帖子,但仍然非常相关。处理此类情况以及从不同操作系统获取文本数据的最简单方法是首先对信息进行规范化。这是Javascript代码,但您应该能够轻松地将其转换为任何其他语言。

        body = body.replace(/(\r\n|\r)/g,"\n");

在大多数语言中,它可以被翻译成这样(但在JS中,它只会替换第一次出现的情况)。
        body = body.replace("\r\n","\n");
        body = body.replace("\r","\n");

它将确保换行符由"\n"表示,如果您想要Windows格式,只需在上述内容后添加即可。
        body = body.replace("\n","\r\n");

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