主要摘录自2篇blog:

http://www.cnblogs.com/clarkchen/archive/2011/06/02/2068609.html

http://www.360doc.com/content/12/1212/13/3735408_253588368.shtml

 

首先介绍一下常见的2个字符:

  回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return
  换行 \n 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写成LF,即Line Feed

当最初接触windows下C语言时候我们会强制记住\r\n这种使得输出文本换行的手段;紧接着到了linux环境(后来又是mac)我们使用\n换行,在利用文本在不同平台交换数据或者代码时会出现错误。

首先确定不同平台上的规定:

\n:  UNIX 系统行末结束符

\n\r: window 系统行末结束符

\r:  MAC OS 系统行末结束符

一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

出现这种情况有其历史原因:

  在计算机还没有出现之前,有一种电传打字机(Teletype Model 33),每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。

  于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。

  这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。

  后来,计算机发明了,这两个概念也就被搬到了初期的计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了现在不同操作系统上的分歧。

在平时工作中解决此历史问题的方法如下:

1. Linux中打开Windows中的文件

由于Linux用\n=0x0A=10=LF来表示换行,所以,打开Windows中的文件的时候,如果其中有换行,即其中有\r \n= 0x0D 0x0A,此时,就会被处理为,只将\n理解为换行,而把\r看作为一个单独的字符,此\r字符,对应ASCII的值是0x0D=13,是个控制字符,对应的是用Ctrl+M=一个Ctrl加上一个大写的M字符,在Linux中的文本编辑器中,如Vi中,对应显示为一个“^M“。

解决办法:

(1)Linux下,用命令:

  tr -d "\015" < myfile.txt > myfile_new.txt

  将其中^M去除掉。其中\015中的015是八进制的15=十进制的13=十六进制的0x0D。

(2)或者用dos2unix工具处理:

  dos2unix < file.txt>

详情参见:

【整理】如何取消Linux下,vi中显示的^M符号

  http://www.crifan.com/order_how_to_cancel_under_linux_vi__m_symbol_in_the_display/

2. Mac中打开Windows中的文件

  同理,Mac中打开Windows中的文件,如果有回车换行的话,只会识别其中的\r=0x0D,而将余下的\n=0xA=LF看成一个单独的字符,显示出“^J”。

  如果使用vi可以利用s命令替换每一行的末尾字符为空。

3. Windows中打开Mac或Linux中的文件

  经过测试,发现,在windows中,估计把原先的0x0D 0x0A去掉其中任何一个的话,然后用windows下的文本类编辑器再去打开,发现:

  除了最简单的Windows自带的Notepad,无法正常识别回车换行,内容被显示到同一行中之外;其他一些编辑器,如Notepad2,Notepad++,Windows自带的记事本WordPad,都可以正常识别成回车换行,不会将内容都输出在同一行。

因此对于程序员来讲从显示角度是不会有大的影响。

  

 

Posted on 2015-02-26 18:23  as_fan  阅读(1480)  评论(0编辑  收藏  举报