细说"回车"和"换行"的故事
引言
最近在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
细说"回车"和"换行"的故事的更多相关文章
- T-SQL的回车和换行符(SQL)
T-SQL的回车和换行符(SQL) sql server中的回车换行字符是 char(13)+char(10) 回车:char(13) 换行:char(10) 实例1: DECLARE @c NVA ...
- oracle 回车、换行符
1.回车换行符 chr(10)是换行符,chr(13)是回车, 增加换行符 select ' update ' || table_name || ' set VALID_STATE ='' ...
- windows下回车与换行符
windows下回车与换行符 从键盘输入的数据一般是ASCII码,也就是文本文件,在送到计算机内存时,回车和换行符转换成一个换行符(也就是说回车和换行符在windows文本中是两个字符),再从内存中以 ...
- 解析Linux下\r\n的问题(回车和换行)
http://www.jb51.net/article/37389.htm 深入解析Linux下\r\n的问题 http://www.ruanyifeng.com/blog/2006/04/post_ ...
- \r\n回车换行\r回车\n换行的区别
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33,Linux/Unix下的tty概念也来自于此)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候 ...
- 回车、换行、空格的ASCII码值—(附ASCII码表)
回车.换行.空格的ASCII码值 回车,ASCII码13换行,ASCII码10空格,ASCII码32 Return = CR = 13 = '\x0d'NewLine = ...
- 【代码笔记】iOS-字符串替换回车和换行
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...
- 回车和换行有什么区别?我们平时按下的Enter键是回车还是换行?
来源:http://www.52rd.com/blog/Detail_RD.Blog_imjacob_12317.html -------------------------------------- ...
- ORACLE:除去回车符,换行符
ORACLE:除去回车符,换行符 replace(fa,chr(),'') ; --- 除去回车符 replace(fa,chr(),'') ; --- 除去换行符
随机推荐
- ecshop3.6商品如何按照销量排序
ecshop订单状态对应值:order_status有5中状态,并且当客户确认收货后,order_status的数值不一定是1也有可能是5.order_status = 0表示订单未确认order_s ...
- spring mvc mybatis集成踩的坑
开园这么多年了也没写几篇文章,现在想想光看别人的也不行啊,咱也自己写写,就写这天我我在做spring mvc与mybatis的集成时遇到的问题 1 spring与mybatis的集成 这个相信大家都弄 ...
- 网络语音视频技术浅议(附多个demo源码下载)
我们在开发实践中常常会涉及到网络语音视频技术.诸如即时通讯.视频会议.远程医疗.远程教育.网络监控等等,这些网络多媒体应用系统都离不开网络语音视频技术.本人才疏学浅,对于网络语音视频技术也仅仅是略知皮 ...
- HDFS中NameNode启动过程
移动到hadoop文件目录下 NameNode启动命令:sbin/hadoop-daemon.sh start namenode DataNode启动命令:sbin/hadoop-daemon.sh ...
- SQLite数据库_实现简单的增删改查
1.SQLite是一款轻量型的数据库是遵守ACID(原子性.一致性.隔离性.持久性)的关联式数据库管理系统,多用于嵌入式开发中. 2.Android平台中嵌入了一个关系型数据库SQLite,和其他数据 ...
- Cygwin在线安装指南
详细说明请看文章http://www.crifan.com/files/doc/docbook/cygwin_intro/release/htmls/install_cygwin_setup_exe. ...
- [KISSY5系列]淘宝全终端框架 KISSY 5--从零开始使用
KISSY 是淘宝一个开源的 JavaScript 库,包含的组件有:日历.图片放大镜.卡片切换.弹出窗口.输入建议等 一.简介 KISSY 是一款跨终端.模块化.高性能.使用简单的 JavaScri ...
- 进程间通信系列 之 socket套接字及其实例
进程间通信系列 之 概述与对比 http://blog.csdn.net/younger_china/article/details/15808685 进程间通信系列 之 共享内存及其实例 ...
- Docker学习总结(一)
<认识Docker> 不定期更新~~~~~~~ 历史区别: 13年之前:网络大多使用"协议栈堆叠"的形式进行开发,需要部署单一专有的服务器进行操作.包括(中间件,运行时 ...
- System.Data.SqlClient.SqlException (0x80131904): EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。 EXECUTE 后的事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配。上一计数 = 1,当前计数 = 0。
EF使用ExecuteSqlCommand(db.Database.ExecuteSqlCommand("exec proc_DeleteCaseInfo_Output @caseID&qu ...