陈中正的网络日志

Windows和Linux 行尾符(EndOfLine)的区别

不同操作系统,文本文件的行尾符是有区别的。

1. 各系统关于行尾符(End-of-Line)的规定

     Unix每行结尾为"\n",

     Windows系统每行结尾是“\r\n”, 

     Mac OS在 OS X以前每行结尾是"\r", 现在每行结尾是 "\n".

2. 概念区分

中文名 英文名 英文缩写 英文解释 C语言中表示 ASCII码
回车
carriage return CR return \n 0x0a
换行 line feed LF new line \r 0x0d

3. 回车与换行来历

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

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

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

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

     结果是,

      Unix每行结尾为’\n‘, Windows系统每行结尾是“\r\n”,  Mac系统每行结尾是'\r',

     后果是,

     Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;

     Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个M符号。

4. 编程相关

在Windows系统中,文本文件以"   \r\n"代表换行。

     用fputs等函数写换行符 ' \n'时,Windows会将 ' \n'隐式转换为"\r\n",然后再写入到文件中。

     用fgets等函数读换行符 ' \n' 的时候,Windows会将文件中的"\r\n"隐式转换为'\n',然后再读到变量中。

5. 实例分析 

生成一个包含换行(\n, 0x0A)和回车(\r, 0x0D)组合的文本

     $ echo -en '1\n2\r\n3' > temp

              

十六进制方式查看文本:

     $ xxd temp

       SouthEast

      ![Image 1][]

Linux中查看文本:

     $ xxd -r temp

     $ vim temp

      ![Image 1][] SouthEast 1

Windows中查看文本:

      SouthEast 2

6. 不同平台间文本文件转换

    编辑器实现转换。

          NotePad++/Ultra Edit/Sublime Text2提供了转换功能。

    用Linux命令实现转换。

         Windows到Unix       \( sed -e 's/.\)//' mydos.txt > myunix.txt

         Unix到Windows       \( sed -e 's/\)/\r/' myunix.txt > mydos.txt

  用Linux命令实现转换。  

$ unix2dos filename 
    $ dos2unix filename

[Image 1]:

本文章迁移自http://blog.csdn.net/timberwolf_2012/article/details/28687477

Categories:  C/C++ 

« Ubuntu下使用bochs运行Linux 0.12 文本文件和二进制文件比较 »