文件中的回车与换行

IDE和一些文本编辑器里经常能看到下图中的这个符号:

CRLF

简写 说明 中文 16进制表示 符号
CR Carriage Return 回车 0x0d \r
LF Line Feed 换行 0x0a \n

CRLFCRLF,这些其实是文件使用的换行符字节定义。文件由字节构成,字节在磁盘中顺序存储本没有换行概念,而为文字显示的排版需要,文件中可以使用一些特殊字节来表示换行符。在LinuxWindowsMac上,因为历史原因对换行符的字节定义并不相同,但也无非是回车换行这两个字节的组合。

系统 换行符 16进制表示 符号
Windows CRLF 0x0d0a \r\n
Linux LF 0x0a \n
Mac(OS X 之前) CR 0x0d \r
Mac(OS X 之后) LF 0x0a \n

比如在Windows中建立一个文件,存入以下内容:

1
2

12之间存在换行,该文件的字节表示为:

# 0x31是ASCII码的数字字符1,0x32是ASCII码的数字字符2
# 0x0d 0x0a即CRLF换行符
0x31 0x0d 0x0a 0x32

如果在Mac中创建同样内容的文件,其字节表示为:

# 0x0a即LF换行符
0x31 0x0a 0x32

既然WindowsMac创建的文件使用不同的字节来定义换行符,是否意味着一个系统创建的文件在另一个系统中打开时会出现换行错误呢?理论上是这样,但是现代文本编辑器基本都可以识别出文件使用的是哪种换行符,再进行文本排版,有的也支持在不同换行符中转换,所以这个问题已经很少见了。

回车与换行的来源

换行符的定义中为什么会有回车这种概念呢?它其实源于老式的打字机,使用这种打字机每打一个字符,承载印字头(Carriage)的字车就会向右移动一个字符位,当打到行尾的时候需要将印字头归位到左边的行首,执行这个操作的按键就是Carriage Return回车键。

之后再按Line Feed换行键,打字纸会向上移动一行,这样印字头就到了下一行的行首。也就是说,使用这种打字机必须先后按下回车键和换行键才能实现真正的换行操作,后来出现计算机,需要把电子文档发送到同样原理的老式电传打字机上,所以电子文档也存在回车换行两种字符,在Windows中一直延续下来。

Typewriter

arrow_upward