• 细说"回车"和"换行"的故事


    引言

    最近在php还有c#以及memcache的shell当中经常看到 的写法,刚开始还没注意,

    不过后面感觉这样写有些不对头, 表示回车  表示换行,那这样不是换行了两次吗?

     为了解决疑惑,问了下度娘,总算对 有了新的认识。

     

    解释

    首先 是回车, 是换行,这毋庸置疑,但是前者的作用只是将光标移到行首,后者是将光标移到下一行。

    也就是说 你敲键盘的 回车键<Enter> 其实是回车和换行的组合键( )。不同的操作系统,其原理也不一样

    如果把一个文本的空格和回车等都反转义,就是显示出转义符,那么你会看到

    windows每行结尾都有
    
    
    Unix每行结尾只有
    
    
    Mac每行结尾只有
    

    这个三个操作系统是故意的吧,这么不统一,这也是为啥 linux 文件拿到 windows 下会错行的原因。

    下面做个小实验来看看这个错行现象

    实验

    1.在 Linux 下vim a.txt 编辑一个文本

     

    2.把这个文本弄到windows下面看看

     

     可以发现错行了!!!因为对于windows上面的换行条件还少了个字符

    那么windows下看起来正常的文件在Linux下面又会变成啥样?

    3.在Windows下编辑一个文本

    通过ftp传到Linux下后,打开

    简直惨不忍睹,H和o都合并再一起了,^M又是啥玩意,不着急后面会讲到

    可见得我们在平时使用电脑时,已经习惯了回车和换行一次搞定,敲一个回车键,即是回车,又是换行。

    
      软回车
    在Windows 中表示换行且回到下一行的最开始位置。
    在Linux、unix 中只表示换行,但不会回到下一行的开始位置。


    
      软空格
    在Linux、unix 中表示返回到当行的最开始位置。
    在Mac OS 中表示换行且返回到下一行的最开始位置。 

     下面是回车和换行的历史,有兴趣的人可以阅读下

     

    历史

    回车(carriage return)和换行(line feed)两个概念的来历和区别

     

    计算机还没出生之前,有一种玩意叫电传打字机,每分钟可以打10个字符。但是他有个问题,

    就是打完一行换行的时候要用去0.2秒,大约是打两个字符的时间。

    而就在他使用这0.2秒进行换行的时候又有新的字符传过来,那么这个字符将会丢失。

    于是,研制人员想了个办法解决这个问题,就是在每行后面加两个字符表示结束的字符。

    一个叫做回车,它用来告诉打字机把打印头定位于在左边界,另个叫换行,它用来告诉打字机

    把纸往上挪一下。这样打字机在换行时使用的0.2秒时间丢弃的只是两个不需要显示出来的字符。

     

    计算机诞生后,这两个字符也搬了过来,那时候存储器很贵,一些科学家觉得每次换行都要花费空间来放下这两

    个字符太浪费了,加一个就可以了,于是出现了分歧。Unix系统每行结尾只有 ,Windows系统每行结尾是

    ,Mac系统每行结尾是 。一个直接的结果就是如我上面的实验那样,同一文本在不同系统下会出现不同的结

    果,这当然不是我们想要的效果

     

    Dos 和 Windows 采用回车+换行 CR/LF 表示下一行即 ^M$

    Unix 和 Linux 采用换行 LF 表示下一行即 $

    Mac 采用CR表示下一行 即^M

    CR 用 表示 十进制ASCII为13 十六进制0x0D

    LF 用 表示  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 "
    "<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

  • 相关阅读:
    Ajax实践学习笔记(三) Ajax应用模型
    代码之美
    Git 和Github初次使用 (转) Anny
    VisitsPageViewUnique Visitors: Metrics From GA Anny
    Building and Installing Node.js Anny
    Callback in NodeJS Anny
    Intall Apache & php on Ubuntu Anny
    [转载]Linux系统下超强远程同步备份工具Rsync使用详解 Anny
    Cannot Boot WEBrick: "WARN TCPServer Error: Address already in use " Anny
    chmod(转) Anny
  • 原文地址:https://www.cnblogs.com/demonxian3/p/6917133.html
Copyright © 2020-2023  润新知