最近在 php 还有 c# 以及 memcache 的 shell 当中经常看到 \ r\n 的写法,刚开始还没注意,
不过后面感觉这样写有些不对头,\r 表示回车 \n 表示换行,那这样不是换行了两次吗?
为了解决疑惑,问了下度娘,总算对 \ r \n 有了新的认识。
首先 \r 是回车, \n 是换行,这毋庸置疑,但是前者的作用只是将光标移到行首,后者是将光标移到下一行。
也就是说 你敲键盘的 回车键 <Enter> 其实是回车和换行的组合键 (\r\n)。不同的操作系统,其原理也不一样
如果把一个文本的空格和回车等都反转义,就是显示出转义符,那么你会看到
- windows每行结尾都有\r\n
- Unix每行结尾只有\n
- Mac每行结尾只有\r
这个三个操作系统是故意的吧,这么不统一,这也是为啥 linux 文件拿到 windows 下会错行的原因。
下面做个小实验来看看这个错行现象
1. 在 Linux 下 vim a.txt 编辑一个文本
2. 把这个文本弄到 windows 下面看看
可以发现错行了!!!因为对于 windows 上面的换行条件还少了个字符 \ r
那么 windows 下看起来正常的文件在 Linux 下面又会变成啥样?
3. 在 Windows 下编辑一个文本
通过 ftp 传到 Linux 下后,打开
简直惨不忍睹,H 和 o 都合并再一起了,^M 又是啥玩意,不着急后面会讲到
可见得我们在平时使用电脑时,已经习惯了回车和换行一次搞定,敲一个回车键,即是回车,又是换行。
- \n 软回车
- 在Windows 中表示换行且回到下一行的最开始位置。
- 在Linux、unix 中只表示换行,但不会回到下一行的开始位置。
- \r 软空格
- 在Linux、unix 中表示返回到当行的最开始位置。
- 在Mac OS 中表示换行且返回到下一行的最开始位置。
下面是回车和换行的历史,有兴趣的人可以阅读下
回车 (carriage return) 和换行 (line feed) 两个概念的来历和区别
计算机还没出生之前,有一种玩意叫电传打字机,每分钟可以打 10 个字符。但是他有个问题,
就是打完一行换行的时候要用去 0.2 秒,大约是打两个字符的时间。
而就在他使用这 0.2 秒进行换行的时候又有新的字符传过来,那么这个字符将会丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个字符表示结束的字符。
一个叫做回车,它用来告诉打字机把打印头定位于在左边界,另个叫换行,它用来告诉打字机
把纸往上挪一下。这样打字机在换行时使用的 0.2 秒时间丢弃的只是两个不需要显示出来的字符。
计算机诞生后,这两个字符也搬了过来,那时候存储器很贵,一些科学家觉得每次换行都要花费空间来放下这两
个字符太浪费了,加一个就可以了,于是出现了分歧。Unix 系统每行结尾只有 \ n,Windows 系统每行结尾是 \ r
\n,Mac 系统每行结尾是 \ r。一个直接的结果就是如我上面的实验那样,同一文本在不同系统下会出现不同的结
果,这当然不是我们想要的效果
Dos 和 Windows 采用回车 + 换行 CR/LF 表示下一行即 ^M$
Unix 和 Linux 采用换行 LF 表示下一行即 $
Mac 采用 CR 表示下一行 即 ^M
CR 用 \ r 表示 十进制 ASCII 为 13 十六进制 0x0D
LF 用 \ n 表示 ASCII 为 10 十六进制 0X0D
需要注意的是,不同平台之间用 FTP 协议传输文件时,在 ASCII 模式下传输可能会自动对换行进行转换,从而导致字节数的变更
如果不想 ftp 对文件的修改,可以使用 Bin 模式进行文本传输。那么如何解决不同平台的文本错行显示呢?
1.windows 文本到 linux 下的转换方法.
(1) 使用 sed 命令进行替换
- sed-e's/^M//g'old.txt > new.txt
注意这个 ^M 是先按 Ctrl+V 然后按 Ctrl+Shift+M 才能打出来的不是直接打 ^M
==
(2)vim 编辑器的替换命令
- : %s / ^M //g
=>
同样 ^M 不是直接打出来的,会变成蓝色,而不是白色
(3) 使用命令行
- tr-d"\r"unixfile
(4) 使用 dos2unix 工具
- dos2unix a.txt #直接转换
- dos2unix -n a.txt b.txt #保留源文件
(5)FTP 传输工具
如果是以 ASCII 模式传输,那么 FTP 会帮你转换
如果是以 Binary 模式传输,那么 FTP 保留原文件
如果有些细节上的问题不重视,那么可能就会带来头疼的问题,或者不必要的麻烦。
来源: http://www.cnblogs.com/demonxian3/p/6917133.html