文件中的回车与换行
立泉在 IDE 和文本编辑器里经常看到图中的这个符号:
简写 | 说明 | 中文 | 16进制表示 | 符号 |
---|---|---|---|---|
CR | Carriage Return | 回车 | 0x0d | \r |
LF | Line Feed | 换行 | 0x0a | \n |
CR、LF 和 CRLF,这些其实是文件使用的换行符字节定义。文件由字节构成,字节在磁盘中顺序存储本没有换行概念,而为文字显示的排版需要,文件中可以使用一些特殊字节来表示换行符。Linux、Windows 和 Mac 因为历史原因对换行符的字节定义并不相同,但都是回车和换行这两个字节的组合。
系统 | 换行符 | 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
1
和2
之间存在换行,该文件的字节表示为:
# 0x31 是 ASCII 码的数字字符 1,0x32 是 ASCII 码的数字字符 2
# 0x0d 0x0a 即 CRLF 换行符
0x31 0x0d 0x0a 0x32
如果在 Mac 中创建同样内容的文件,其字节表示为:
# 0x0a 即 LF 换行符
0x31 0x0a 0x32
既然 Windows 和 Mac 创建的文件使用不同的字节来定义换行符,是否意味着一个系统创建的文件在另一个系统中打开时会出现换行错误呢?理论上是这样,但是现代文本编辑器基本都能识别文件使用的是哪种换行符,再进行文本排版,而且支持在不同换行符中转换,所以这个问题已经很少见。
回车与换行的来源
换行符的定义中为什么会有“回车”概念呢?它其实源于老式打字机,使用这种打字机每打一个字符,承载印字头(Carriage)的字车会向右移动一个字符位,打到行尾时需要将印字头归位到左边行首,执行这个操作的按键就是 Carriage Return 回车键。
再按 Line Feed 换行键,打字纸会向上移动一行,这样印字头就到了下一行的行首。即用这种打字机必须先后按下回车键和换行键才能实现真正的换行操作,后来出现计算机需要把电子文档发送到同样原理的老式电传打字机上,所以电子文档也存在回车和换行两种字符,在 Windows 中一直延续下来。