乱码(三)行尾的^M

Windows下,文本文件的行尾有CR和LF两个字符。这两个字符的Ascii编码分别是0x0D和0x0A,也就是十进制下的13和10.

早些年的时候,Windows下创建的文件,在Linux下用Emacs打开,可以看到每行的行尾都有一个
^M
记号。

因为Linux下的文本行尾只有一个字符,0x0A,也就是十进制的10。那么,那个十进制的13就显示为^M了。

那么,为什么是^M呢?为了ascii码表的整齐。0被规定显示为^@,1对应^A,2对应^B,依次数下去,13就对应^M

现代的Emacs已经不显示这个^M了,而把文件自动识别为DOS格式。想要再现出^M来,还要费些周折。

行尾的字符

但Windows下,c语言的putchar函数,有个特征可以很容易再现:putchar(10),会输出两个字符,13 和 10。而getchar则会把这两个字符合并成一个。

那么,行尾究竟是哪一种好呢?这个问题还真不好说。如果说单纯的换行好的话,那么HTTP协议中分隔符却规定为0x0D,0x0A。Linux下用一个字符表示换行,很多编程方式都得到了简化,以至于处理二进制文件的方法和处理文本文件的方法基本相同。

使用 0x0D 0x0A 两个字符是尊重传统的方法,因为最早打印机打字的时候,回车表示倒回行首,换行表示进入下一行,这是两个动作。使用两个字符,遵循传统。

使用一个字符是创新的方法,简化设计。Mac系统据说在这个问题的选择上经历过变化,但一直只用一个字符。由于手头没有Mac电脑,不能实地观察了。

尊重传统和创新,一样都是极好的。

你可能感兴趣的:(乱码(三)行尾的^M)