回车符(CR)与换行符(LF)之间的故事

请注意,本文编写于 311 天前,最后修改于 59 天前,其中某些信息可能已经过时。

写在前面

计算机中,涉及换行的字符有两个:

  • 换行符 LF (Line Feed),ASCII 码为 0x0A,转义字符为\n
  • 回车符 CR (Carriage Return),ASCII 码为 0x0D,转义字符为\r
    不同的系统使用不同的换行方式:
  • LF:Unix/Linux、Mac OS X;
  • CR + LF:DOS/Windows;
  • CR:Mac OS 9 以前。
     

简单的观察

因此,在一个平台上创建的文本文件,拿到另一个平台上打开,就可能会出现因换行符不兼容导致的显示问题。

比如,在 Linux 下创建一个“linux.txt”文本文件,输入几行内容,然后用 Windows 的记事本打开,就会发现所有内容都在一行。

 

在 Windows 下创建一个“windows.txt”文本文件,同样输入几行内容,然后在 Linux 中使用以下命令命令打开,会发现每次换行前多了一个特殊字符^M

$ cat -A windows.txt

 

cat -A命令:显示不可见字符。如换行符显示为“$”,TAB 显示为^I等。在这种模式下,回车(\r)字符将显示为^M

 

如果在 Linux 上使用 vim 打开 windows.txt,则会发现 vim 底部显示[noeol][dos],这表示该文件没有“end-of-line”,并且是 DOS 系统的格式(也就是 Windows 格式啦)。

 

用 od 命令直接查看编码

Linux 下的命令od可以将文件以二进制、八进制或十六进制的形式输出。这里我们采用十六进制输出。在 ASCII 码中,一个字符占一个字节的空间,一个字节是 8 位,一个十六进制位代表 4 位,因此用两个十六进制位就可以表示一个 ASCII 字符了。

使用如下命令分别查看 windows.txt 和 linux.txt(文件内容见上文)。

$ od -x windows.txt
$ od -x linux.txt

 

可以看到,Windows 下创建的文件换行处为 0d0a 两个字符的组合,而 Linux 下创建的文件换行处仅为 0a一个字符。

 

拓展

在上图中,以十六进制查看 windows.txt 显示的明明是0a0d,为什么说是0d0a呢?

在文章开头我也提到了,DOS/Windows 下的换行符为 CR + LF,其 ASCII 码确实是 0a 和 0d,这究竟是为什么?

请你自己查阅资料,关键词:大小端


Comments

添加新评论

已有 2 条评论

LittleWhite LittleWhite

很清楚,学到了!

文章不错非常喜欢