ywsswy / blog

blog is not bug.
0 stars 0 forks source link

回车与换行的相爱相杀 #10

Open ywsswy opened 5 years ago

ywsswy commented 5 years ago

在计算机还没有出现之前,有一种叫做电传打字机的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”(carriage return),告诉打字机把打印头定位在左边界;另一个叫做“换行(line feed)”,告诉打字机纸要进下一行。这就是“换行”和“回车”的来历。

后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出 现了分歧。(Windows,Linux,Mac在文件读写换行上面会有差别)

二者区别整理如下:

- CR LF
中文名 回车符 换行符
英文名 carriage return line feed
转义表示法 \r \n
ASCII码值,Vim中查看16进制来判断':%!xxd' 13(0xD) 10(0xA)

1.

2. 正斜杠与反斜杠

- 正斜杠 反斜杠
写法 / \
english forward slash backward slash
区别记忆 普通符号(例如'/n'是两个字符) 特殊(转义)符号(例如'\n'是一个字符)
应用场景 html标签、URL网址、Unix系统文件分隔符、分号、除法 Windows系统文件路径分隔符(虽然cmd中正反都能识别,但是要使用Tab自动补全的话,>还是要反斜杠)、代码中代表指令连接下一行

3.一次有趣的实验

一个windows中创建的文件,在ubuntu中打开每一行结尾都显示'^M',然后vim中使用命令':%s/^M/\r/g'后,'^M'被替换成'\r',这样就从原来每行结尾一>个'^M',变成了每行下面都多出一个空行,此时使用命令':%!xxd'后,发现是0x0a,也就是(\n),好神奇啊,就是说vim中命令的'\r'写到文件中就是'\n',这是什么原因呢?(当然接下来要去掉多出来的所有空行/偶数行,使用命令':%s/\n\n/\r/g')

猜测一下原因的话就是,命令':%s/pat1/pat2/g'中,pat1是读文件找匹配,pat2是写文件来替换;读文件的话显示'\r'就成了'^M',显示'\n'就成了'$'; 写文件的话写入'\r'就成了'\n',写入'\n'就成了'\0'(因为Linux中以为你要写这行结尾,而Linux行尾是不用'\n'的)。

其他:不管怎么写文件,用vim打开文件最后一个字符都会是'\n';vim的显示是……人性化的,比如如果文件中全都是'\r\n'的话,vim中也只显示'$',但>是如果既有'\r\n'又有'\n',vim就会把'\r\n'显示成'^M'以示特殊……

5.相关链接

https://www.cnblogs.com/codingmengmeng/p/6179822.html

https://blog.csdn.net/bdss58/article/details/77775770

https://wenku.baidu.com/view/ca728b68b84ae45c3b358c69.html

2018.11.9 整理