关于换行-有趣的小细节

最近跨平台做的东西比较多,发现一个很有意思的情况是经常在Linux/OSX下显示得好好的文档,一到windows底下用默认记事本双击一打开就是长长的一行,完全没法看。

今天正好做Python,查到\r\n的区别,仔细一看发现上面困扰的问题原来还和这个有关。

首先要说到的是“回车”(Carriage Return)和“换行”(Line Feed)这两个概念的来历和区别。

符号        ASCII码        意义

\n            10          换行

\r            13          回车CR

这两个不同符号和古老的打字机有关,打字机上面换行和回车是两个动作,电传打印机接到换行指令时只是把打印头下移一行(或者说是打印的打印纸上送一行),而接到回车指令时会把打印头移动回左边界。这样,一个打完一行换下一行的动作都由换行和回车两个动作组成。

到了计算机时代,人们自然想到的继承打字机的原理,在每行末尾添加\r\n。但早期计算机存储量小,一个换行就占两个字节,一些科学家就觉得不如我们换成一个字符?但是不是所有人都同意这样,也就造成了目前不同系统使用换行符不同的状况。

大部份老的操作系统中:

   - '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖;

   - '\n' 换行,换到当前位置的下一行,而不会回到行首;
  • Unix系统里(以及C和目前大部分的编程语言中),每行结尾只有“<换行>”,即”\n”;
  • Windows系统里面,每行结尾是“<回车><换行>”,即“\r\n”;
  • OSX之前的Mac系统里,每行结尾是“<回车>”,即”\r”;。

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。