写在前面
计算机中,涉及换行的字符有两个:
- 换行符 LF (Line Feed),ASCII 码为 0x0A,转义字符为
\n
; - 回车符 CR (Carriage Return),ASCII 码为 0x0D,转义字符为
\r
。
不同的系统使用不同的换行方式:
- LF:Unix/Linux、macOS;
- CR + LF:DOS/Windows;
- CR:Mac OS 9 以前。
本文地址:https://www.jeddd.com/article/story-between-cr-and-lf.html
简单的观察
因此,在一个平台上创建的文本文件,拿到另一个平台上打开,就可能会出现因换行符不兼容导致的显示问题。
比如,在 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.jeddd.com/article/story-between-cr-and-lf.html
很清楚,学到了!
文章不错非常喜欢