引言

最近在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 十六进制0X0A

看!有图有真相,我可没瞎说哈。

解决

需要注意的是,不同平台之间用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"<dosfile > 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

细说"回车"和"换行"的故事的更多相关文章

  1. T-SQL的回车和换行符(SQL)

    T-SQL的回车和换行符(SQL) sql server中的回车换行字符是  char(13)+char(10) 回车:char(13) 换行:char(10) 实例1: DECLARE @c NVA ...

  2. oracle 回车、换行符

    1.回车换行符 chr(10)是换行符,chr(13)是回车, 增加换行符 select ' update ' || table_name ||       ' set VALID_STATE ='' ...

  3. windows下回车与换行符

    windows下回车与换行符 从键盘输入的数据一般是ASCII码,也就是文本文件,在送到计算机内存时,回车和换行符转换成一个换行符(也就是说回车和换行符在windows文本中是两个字符),再从内存中以 ...

  4. 解析Linux下\r\n的问题(回车和换行)

    http://www.jb51.net/article/37389.htm 深入解析Linux下\r\n的问题 http://www.ruanyifeng.com/blog/2006/04/post_ ...

  5. \r\n回车换行\r回车\n换行的区别

    在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33,Linux/Unix下的tty概念也来自于此)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候 ...

  6. 回车、换行、空格的ASCII码值—(附ASCII码表)

    回车.换行.空格的ASCII码值 回车,ASCII码13换行,ASCII码10空格,ASCII码32 Return   =   CR   =   13   =   '\x0d'NewLine   = ...

  7. 【代码笔记】iOS-字符串替换回车和换行

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...

  8. 回车和换行有什么区别?我们平时按下的Enter键是回车还是换行?

    来源:http://www.52rd.com/blog/Detail_RD.Blog_imjacob_12317.html -------------------------------------- ...

  9. ORACLE:除去回车符,换行符

    ORACLE:除去回车符,换行符 replace(fa,chr(),'') ; --- 除去回车符 replace(fa,chr(),'') ; --- 除去换行符  

随机推荐

  1. python 实例方法,类方法和静态方法

    在学习python代码时,看到有的类的方法中第一参数是cls,有的是self,经过了解得知,python并没有对类中方法的第一个参数名字做限制,可以是self,也可以是cls,不过根据人们的惯用用法, ...

  2. 使用vs2015搭建Asp.net Core

    准备工具    1.首先得安装vs2015 并且升级至 update3及以上  2.安装.net core sdk.附上官网下载地址 http://www.microsoft.com/net/down ...

  3. 想询问一个职业规划的问题,前端开发 or nodejs?

    先说说个人情况,目前个人定位于初中级前端吧,工作近两年,目前前端开发和nodejs都有一定的了解,水平感觉可以搭一些小型的网站.作为前端开发,目前掌握的技术是javascript,平时更多的是用jqu ...

  4. 使用vue-cli构建多页面应用+vux(一)

    众所皆知,vue对于构建单页面应该相当方便,但是在项目中难免遇到有多个页面的情况. 1.先安装vue-cli脚手架,具体步骤看vue-cli的官方github地址 https://github.com ...

  5. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  6. Jsoup抓取、解析网页和poi存取excel综合案例——采集网站的联系人信息

    需求:采集网站中每一页的联系人信息 一.创建maven工程,添加jsoup和poi的依赖包 <!-- https://mvnrepository.com/artifact/org.apache. ...

  7. mysql分页查询优化

    由于MySql的分页机制:并不是跳过 offset 行,而是取 offset + N 行,然后返回放弃前 offset 行,返回N 行, 所以当 offset 特别大的时候,效率就非常的低下,要么控制 ...

  8. 详解MySQL存储过程的“异常处理”

    阅读目录:存储过程的异常处理 定义异常处理 单一异常处理程序 continue exit 多个异常处理程序 关于错误编号和SQLSTATE码 使用3个处理程序 忽略某一异常的处理 异常处理的命名 异常 ...

  9. luogu P1007 独木桥

    序:难度标签是普及-,便觉得应该非常简单,结果发现有一个弯半天没绕过来,所以认为这道题对于第一次做的人来讲还是很是比较有意义的. 题目描述: 长度为len的桥上有n个士兵,你不知道他们的初始方向.已知 ...

  10. 九思老客户分享:部署OA办公系统的四大意义

    原文:http://www.jiusi.net/detail/472__776__4009__1.html 关键词:OA办公系统.oa系统 .九思OA 九思老客户分享:部署OA办公系统的四大意义 当今 ...