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

2018年9月12日 1 条评论 70 次阅读 0 人点赞

写在前面

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

  • 换行符 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 下创建的文件换行处为 0d 0a 组合,而 Linux 下创建的文件换行处仅为 0a。

 

拓展

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

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

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

本文地址:https://www.jedbit.com/article/story-between-cr-and-lf.html

Jed

一名狂热的技术爱好者。

文章评论(1)

  • 头条

    文章不错非常喜欢

    2018年9月21日
  • 提示:有人回复时会邮件通知您