CreateArtTechnology
/ Blog
Login
最新文章
Java
语言相关
库相关
虚拟机相关
CreateArtTechnology
项目搭建
使用的工具
自研的工具
开源工具
ELK
ElasticSearch
Jenkins
Markdown
GraphQL
Arthas
生产工具
Linux
Nginx
VersionControl
Subversion
Git
Redis
Archiva
Maven
Zookeeper
Spring
SpringBoot
MySql
HBase
Cassandra
容器化
Docker
Kubernetes
服务容器化从零开始
未分类笔记
算法相关
概念相关
豆知识
机器学习
机器学习从零开始
\r和\n行尾符引发的思考
51
2019-06-20 14:59:16
豆知识
## 背景 如果你经常需要在Windows系统和Linux系统之间进行文本传输,就会发现同一个文件在不同系统上的表现形式不一样,比如: - Linux上编辑好的多行文本文件,在Windows系统展示成一行 - Windows上编辑好的正常的多行文本,在Linux上展示时行与行之间多了一个换行 - Linux上编辑好的文本文件通常在Linux和Windows上都能正常被程序识别 - Windows上编辑好的文本文件通常只能在Windows上正常读取,在Linux上可能有问题导致读取异常 - Windows中使用`print('\n')`通常无法换行 是的,关键问题就出在行尾符上。 - Windows的换行符是`\r\n`,也就是`CRLF`两个字符 - 而Linux的换行符是`\n`,也就是`LF`字符 - Mac系统是`\r`(还有这种操作?) ![](/img/pic/2019062015032308926_png_297_67_2047) > 使用Notepad++可以显示行尾符 今天我突发奇想,打算探究一下为何不同系统的换行符定义不同,到底是Windows画蛇添足还是Linux偷工减料Mac自作聪明?究竟是人性的泯灭还是... 显然,作为视Windows为“娱乐操作系统”的人,我肯定觉得“专业操作系统”Linux做法是正确的。事实真是这样吗?我们继续往下看。 ## CR和LF 首先我想弄明白CR和LF究竟是什么意思,是什么单词的缩写。 因为不知照着资料我都不知道是CRLF这个缩写顺序对不对...难道是CFLR?还是LFCR?CLFR? 参考资料[为什么会用\r\n两个字符表示换行?](https://www.zhihu.com/question/29326647)中搬出了电脑的老祖宗——打字机。 我们都清楚,打字机换行时的行为是这样: 1. 打印纸上升大概一行的举例,这样打印头(打印元件)在水平距离上对到了下一行 2. 打印头从右向左回到行首,准备开始下一行的打印 没错,这个动作和我们换行时屏幕光标下移到新行的行首一样。 真正的换行确实是两个动作,即`换行进入下一行`和`光标回到行首`,两个动作其实各司其职。 在打字机上,确实有两个对应的按键,即`Line Feed(LF,换行)`和`Carriage Return(CR,回车,Carriage有马车的意思,叫回车没毛病)`。 ![](/img/pic/2019062014565193923_png_720_540_440198) > 打字机 Teletype Model 33,类似键盘回车键的位置有这两个按键 ![](/img/pic/2019062014584201424_png_909_423_177943) ![](/img/pic/2019062014585384425_png_588_472_48385) > ASCII表,其中\n的定义为Line Feed,\r的定义为Carriage Return ### 为什么要分成两个按键 显然打字机没有删除按键,那如果打错字了怎么办?难不成整页重打? 不,打字员打错字时,可以用涂改液把当前这一样涂掉,然后使用`Carriage Return`键,把打印头移到行首就可以重打这行了。 因此,这两个功能由于历史原因,并不是捆绑在一起的,有分开使用的场景和需求,就成了两个按键。 **ps.还有一种说法是打字机的换行和回车动作消耗的时间刚好够打两个字,而这段时间内任何输入打字机都无法处理,所以硬拗出两个按键“培养打字员的等待习惯”,也就是强行让打字员多打俩字避免在打字机无法处理时打其他的字。这种说法我表示不赞同。** 无论如何,在打字机时代遇到换行问题,CRLF已经成了行业规范。 ### 现代操作系统的改变 计算机已经跟打字机有了一定的区别,比如可以直接在原处修改,不再需要涂改重打这种功能,因此实际上换行和回车两个功能已经可以合并为一个功能了。 另外,两个行尾符导致信息冗余,造成存储空间浪费,在存储容量较小的过去显然是很划不来的。 在这时候,各种操作系统就产生了分歧,使用了不同的行尾符。 ## 结论 参考资料表示实际上ISO和ANSI标准中是使用CR+LF作为换行处理标准的,因此Windows是遵从标准的。 据说还有只用LF换行,用CR字符实现了特殊打印效果的,比如 ~~删除线~~ 和 **加粗**,还算比较形象。 ## 补充 `\n`大概是`\next`的意思,`\r`大概是`\return`的意思,这样比较好记。 类似的,`>`是`great than`即大于,`<`是`less than`即小于,有的符号知道缩写后就比较好记。 ## 参考资料 [为什么会用\r\n两个字符表示换行? - 知乎](https://www.zhihu.com/question/29326647) [回车和换行 - 阮一峰的网络日志](https://www.ruanyifeng.com/blog/2006/04/post_213.html)
发布文章 101
文章被阅读 1589
最近修改
什么是“丝滑”的曲线
2021-12-08 15:19:20
高效空间数据索引R树及其批量加载方法STR简介
2021-09-29 20:33:37
关于分库分表的一些事儿
2021-06-25 11:51:25
获得诺奖的稳定匹配理论之TTC算法与GS算法
2021-03-14 23:04:48
算法小白的机器学习入门实践,从零到上线
2021-01-13 14:28:27
分站宗旨
一站式资料平台,减少重复检索,减少重复采坑。