换行符号:CR与LF

发布时间 2023-03-30 16:43:07作者: 诸葛蛋蛋

在读计网时,报文格式遇到了一直没弄明白的“回车”和“换行”。'\r' '\n'。

这与最开始的机械打字机有关

https://www.bilibili.com/video/BV1bs411M7oe/?from=search&seid=13264116207890255785&spm_id_from=333.337.0.0&vd_source=eee2b19a6c821bc098b68b1968932c4c

(薇尔莉特的打印机)
CR:carriage return, 行首打印时要把纸张载具拉到右边,实现水平移动。

LF:line feed,换行,实现垂直移动。

感谢大佬的知乎回答

Unix系统里,每行结尾只有"<换行>",即"\n";Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";Mac系统里,每行结尾是"<回车>"。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。(后面会有解释)


一些问题的解释:

1.为什么CRLF是正统而不是LF LFCR CR呢?

这是电传打字机的设计细节。一是因为最早CR有延迟,LF没有(后来有了高速机型就都没有了——准确说延迟都在字符时隙以下了),同时CR和LF完全是两套机械系统控制,一套横向拉回,一套纵向滚动/移动。

另外就是隔行打印需要CR-LF-LF…。先CR可利用等待的时间完成LF,同时连续多个LF可以优化机械实现。于是先执行CR就顺理成章成为标准了

CRLF正统

2.为什么不把CR LF设计成一个键而不是两个键呢?

因为CR和LF分开是必要的,因为用户时常需要加粗部分文字。打印头得先归位CR,再向右移动到需要加粗的单词位置,然后再喷一遍墨水。如果打错了,就要把打错的地方拿涂改液涂掉,按CR重打

参考文章
回车、换行、回车换行、硬回车以及软回车_zohn的学习笔记-CSDN博客_硬回车和软回车的区别

3.为什么unix,c,Linux用LF换行,而Windows,网络协议(最开始产生疑问的地方)用CR RF 换行呢?

如问题1所言,由于打印机的特性,最开始换行符为CR LF。但是在早期,Unix出于经济方面的考虑,1个ASCII码1字节,若使用CR LF,占用2字节,而使用CR会节省1字节。

顺便一提,对照ASCII表,10和13分别对应CR和LF,即在cmd中,按下组合键Ctrl+M可以实现Enter键的功能,同理Ctrl+H可以退格。当然,这得关闭掉"Ctrl快捷键''功能才行,不然的话,会和复制粘贴混淆。

这时候,细心的读者也发现了,这个CR的组合键:Ctrl+M,不就正是Windows文本转到Linux时,出现的^M符号嘛?!这时候可以有一个合理的推测,Linux中的\n,是LF(Ctrl+J)。

Why is the line terminator CR+LF?

So even unix, when left in raw mode, requires CR+LF to terminate lines. The implicit CR before LF is a unix invention, probably as an economy, since it saves one byte per line.

The unix ancestry of the C language carried this convention into the C language standard, which requires only “\n” (which encodes LF) to terminate lines, putting the burden on the runtime libraries to convert raw file data into logical lines.

Unix(1970年)和C语言(1972年重写Unix)的创始人肯•汤普森(Ken Thompson)和丹尼斯•里奇(Dennis Ritchie)相同,后来的Linux则和Unix一脉相承。至于微软(1975年成立)和网络协议(1970-1972年早期ARPAnet建设),时间是交叉的,只不过是走了两条不同的路。

The End-of-Line Story

During the early ARPAnet research days (~1970-1972), this end-of-line
diversity among operating systems made network communication between
diverse host systems difficult. After some discussion (recorded in
early RFCs), the researchers adopted a single convention:

ASCII text transmitted across the network must use the
two-character sequence: CR LF.

This choice was designed to spread the pain equally among all
operating systems of the day; each has to translate to and from the CR
LF convention when text was transferred across the network.


总结

大概可以理解为,CR LF:"明明是我先来的,然而..."