标签:
主要摘录自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,都可以正常识别成回车换行,不会将内容都输出在同一行。
因此对于程序员来讲从显示角度是不会有大的影响。
标签:
原文地址:http://www.cnblogs.com/as-fan/p/4301903.html