文件中的回车与换行
立泉在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
中一直延续下来。