原文链接:Carriage Returns and Line Feeds will ultimately bite you - Some Git Tips


什么是 Carriage 它又为什么要返回?Carriage Return Line Feed 都是什么意思?

打字机上的纸张水平地倚靠在托架上。「回车」(Carriage Return, CR)是一个不可见的控制字符,把打字机重置到文本的行首。

然而,「回车」把托架移回却并没有把纸张推到新的一行,托架只水平移动……

「换行」也是一个不可见的控制字符,逐行转动打字机滚筒。

所以,「回车」和「换行」,两个动作,多年来对应两个控制字符。

每个操作系统看来都以不同的方式编码行结束字符。70年代后期的操作系统都同时使用「回车换行」,因为它们确实每日在和打字机或打印机交互。

Windows 使用「回车换行」,因为 DOS 使用「回车换行」,因为 CP/M 使用「回车换行」,因为历史原因。

Mac OS 使用「回车」很多年,直到 OS X 转为使用「换行」。

Unix 从一开始就只使用单个「换行」而非「回车换行」,可能是因为像 Multics 等系统从 1965 年左右开始就只使用「换行」,每行节省一个字节当时对于存储和传输都是大事。


我曾接触过的机械式打字机,「回车」和「换行」这两个动作是手动完成的。有一年夏天在表哥家玩,他们的打字课作业没做完,用我当劳力。每打一行我把“突出”的部件沿着托架嗖一下推回左边归位(「回车」),然后转动卷纸的把手把字模对准新的空白行(「换行」),记得那台打字机似乎还可以设定行距。

第二段和第四段讲「回车」和「换行」这两个控制字符,控制打字机的动作,我有点迷糊,不确定作者指的是否是其它更先进的打字机(Typewriter),好在不影响理解。

最早用 Visual Basic 编程,到后来 Office 的 VBA、.NET VSTO,CR 和 LF 是不陌生的。

不过英语不好,曾经一度把 CR 和 LF 脑补为 Change line 和 Left forward(其实要是也应该是 backward),整个就弄反了。好在 Widows 平台上这个问题的关键,大部分情况就是两个字符一起使用即可保无虞,倒没出什么岔子。

中文 缩写 全称 转义
回车 CR Carriage return \r
换行 LF Line feed \n

有一次帮人解决一个处理 Word 文档的程序问题,表现为操作文档对象,添加了换行,但是光标还停留在最右侧,马上反应过来问题所在,略得意。

另一次在团队里参照 CodeSmith 根据项目情况弄了个模板代码生成小工具,没注意这个,提交给客户的代码因为行结束符问题导致无法编译,很受挫。

Git

现在你如果常常在操作系统之间共享文件,比如 Git,这个问题仍然值得注意。

在 Windows 上安装 Git,设置 Configuring the line ending conversions 选项时,如果选择默认的 Checkout Windows-style, commit Unix-style line endings,效果等同以下设置,适合跨平台的情况

git config --global core.autocrlf true

以上是全局设置。特殊情况下,某些类型的文件需要个别设置,比如希望保留原来的行结束符,则可以针对每个项目配置 .gitattributes 文件。详情参考 GitHub 文档