`
asjava
  • 浏览: 136996 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

windows和linux换行规则的区别

    博客分类:
  • Java
 
阅读更多

windows和linux换行规则的区别

http://tech.ddvip.com/2014-06/1402403407211028_1.html

2014-06-10 20:30:07

 

 

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

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

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

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

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

因此在linux下创建的文本文件在windows中会连成一行,因为windows认为没有换行符(CRLF)。 在windows下创建的文本文件在linux中可能会出现每一行后面多了一个^M,这个^M要用ctrl + v ctrl + m打出,代表的意思就是CR(Carriage Return).

说到这里有人也许会问,为什么我在windows下创建的文本文件,在linux中显示正常呢?

例如,我在windows下创建一个文本文件a.txt,放到我的linux中,用vim打开

可以看到显示结果正常,行的结尾并没有^M符号。这是因为vim在打开文件时,会自动检测换行符,如果文本的所有换行符都是^M$(CRLF, 即windows的换行标记),那么vim会自动以dos格式显示文本内容,忽略掉每一行结尾的^M$,因此文本显示是正常的。

注意上面我图片的两个箭头指示的vim编辑器最下方的两个标志[noeol]和[dos],先来解释第二个标志"[dos]",这表示vim识别到文本的每一行都是^M$的换行符,因此vim自动以dos文本格式来显示文件。所以我们看到文本显示是正常的。

那 么为什么有的时候windows下创建或编辑的文件在linux下会出现^M呢,vim不是能自动识别吗?这是因为,vim会检查文本的每一行换行符,只 要有一行的换行符不是windows格式,那么vim就会以unix文件格式来显示文件,这时换行符为$, 因此我们会看到文本的行后面多了一个^M符号。

这里我用cat -A显示文件的特殊符号: 文件一共四行,可以看换行符都是^M$(箭头所指),因此vim会用[dos]文件格式来显示这个文本。 这里还可以发现文件的最后一行没有换行符,这就是第一张图vim中的[noeol]标志的由来 ,因为在windows下处理的文本,最后一行是不会加上换行符的,而linux下创建的文本的规则是每一行都有换行符,包括最后一行。因此vim会提示 no end-of-line, 告诉我们这个文件包含没有换行符结束的行。

用wc -l统计这个文件的行数: 结果是3行,少了一行,原因是文件的最后一行没有换行符。

我在linux下用vim编辑一个新文件,内容和刚刚的a.txt一样,用cat -A查看: 可以看到linux下创建的文本,每一行都是有换行符的,包括最后一行,用wc -l统计行数: 这时统计结果正确。

再用sed替换windows下创建的a.txt, 将其中一行的换行符^M$中的^M去掉,变成linux的换行符$

这里我把文件的第二行的换行符替换成了linux格式的$,注意sed命令中的^M 在命令行中不是直接输入,而是 ctrl+v和ctrl+m. 再用vim打开这个文件:

由于第二行的换行符不是^M$格式,vim不会以dos文件格式来显示文件按,可以发现vim下方没有[dos]的提示了,表明vim以unix文件格式来显示这个文件,因此一些行的后面会多了一个^M标志。

 

补充:sed对windows换行符的处理

通过上面可以知道vim对于一个全部使用windows格式换行符的文本文件会以[dos]模式来显示这个文本,自动忽略行尾的^M.

博主在使用sed命令处理一些文件时,会出现一个本来显示正常的文件,被sed处理之后,再打开文件时发现再次出现讨厌的^M. 那么sed是如何处理windows换行符的文本呢?

先在windows下创建一个文本文件,传至我的linux中。用cat -A 显示特殊字符:

这里看到最后一行没有换行符,其他行的换行符为^M$, 使用sed处理这个文本文件,向第二行添加一些内容,再用cat -A查看:

这 里我用.*匹配第二行的所有内容,&表示匹配到的所有内容,在&后面我加上了一些内容,用cat -A查看发现,sed在处理替换时,如果匹配到整个行,那么匹配的内容是除了换行符$(Linux 换行符)外的所有内容,即使这个文本的换行符是^M$(windows 换行符).

因此第二行的文本被sed处理后,^M被我的正则表达式.*当作文本内容而匹配到了,而$不会被匹配,永远在行的末尾充当换行符,这样一来^M和$就被拆散了。因此这一行的换行符在处理后成为了linux格式的换行符$. 用vim打开的效果如下:

因为文件的换行符是linux和windows混杂的,vim以unix文件格式显示这个文件,文件的^M被显示出来,并且第二行的^M被sed匹配到,因而不在行尾。vim下方的[noeol]原因是最后一行在windows下没有换行符,因此也没有^M.

得出结论:sed会把文件中的^M当作文件内容来处理,因此如果用sed处理windows下创建的文本文件,很有可能在处理之后显示时出现讨厌的^M. 关于其他的文本处理器如何处理windows的换行符,还有待进一步研究。

在补充:用cat显示文本时windows与linux换行符的处理

还是上面的文件,在使用sed命令替换之后用cat -A查看文件内容:

不显示特殊字符,使用cat查看文件,发现显示如下:

发现第二行的内容和预想的不一样,我明明是在文件末尾加上的" hello"这个字符串,为什么跑到文件开头了呢,而且还覆盖了原来的字符。

第二行原来的内容是这样的(红色为特殊字符):

My name is Liao^M hello$ 

 

前面说过,^M这个特殊字符(注意这是一个特殊字符而不是两个)所代表意义是回车(Carrige Return). cat在显示第二行内容的时候从第二行的开头开始读取字符并输出到屏幕上,当读取到^M这个特殊字符时,将这个特殊字符的意义理解为最原始回车,打字机时 代,回车表示机头回到一行的开头(注意只是回到当前行开头,换行的意义才是移动到下一行),因此cat会回到行的开头开始输出字符到屏幕,后面的字符被显 示到了这一行开头,这样就会把原本这一行开头的字符覆了。当打印到这一行的末尾时,读取到了$linux换行符,然后换下一行行头开始读取和输出字符。这 样就造成了第二行显示时的奇怪现象。

结论:cat在普通输出内容的模式下,会将^M字符理解为回车,即回到当前行的开头,$字符理解为回车加换行,即到下一行行头开始输出内容。这样如果一个文本的行当中包含一个^M字符时,cat在显示这个文件时会出现意想不到的情况。

例如,我手动创建一个一行的文本,在文本中加入一个回车符^M:

然后用cat显示这个文件:

 

可以发现cat在读取到^M之后回到行的开头开始输出,因此^M后面的字符被输出到了行的开头,覆盖了原来的内容。

小结:

  • windows下创建的文件换行符为^M$,但最后一行结尾没有换行符

  • linux下创建的文件,每一行都会以换行符$结束,包括最后一行

  • vim打开文件时,如果文件的所有换行符都是dos格式的^M$,那么vim会自动以dos文件格式来显示文本文件,否则会以默认的unix格式显示文本,这是可能会在行的结尾出现^M的符号

  • wc -l是以$换行符来统计行数的,因此windows下创建的文件使用wc -l统计行数时会少一行

  • 一个windows下创建的文件,在linux下显示正常,但是用某些文本处理命令,如sed处理后,文件的某些换行符可能会改变,造成显示不正常

  • sed处理文件时,会把windows换行符中的^M当作文件内容,即sed只保留$作为行末尾的换行符,因此可能会造成换行符不一致。

  • cat 在不显示特殊字符输出文件内容时,会将^M当作回车命令处理,而$当作回车加换行。所以如果一个文件的换行符是混杂有linux和windows版本的, 在vim下显示时行尾为多出一个^M, 而cat下会显示正常(因为cat会把^M当作特殊字符处理)。但如果文件中间有^M这个特殊字符时,cat的显示会出现一些问题。

java解决:

String nr=System.getProperty("line.separator");

分享到:
评论

相关推荐

    Windows和Linux换行规则的区别

    但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束...

    windows和linux、Mac系统换行规则的区别.docx

    标题和描述中提到的知识点主要围绕着不同操作系统——Windows、Linux和Mac——在处理文本文件换行规则上的差异。在早期的电传打字机时代,为了防止字符丢失,每行末尾添加了两个字符,一个是回车(CR),另一个是...

    控制jEditorPane和jTextPane换行的演示程序

    3. **自定义换行逻辑**:如果需要自定义换行规则,如在特定字符或长度后自动换行,程序可能会在监听器中实现这样的逻辑。 4. **显示和更新**:`JEditorPane`和`JTextPane`的内容可以通过`setText()`方法进行更新,...

    astyle3.1-for-linux-windows.zip

    AStyle 3.1 版本是该工具的一个稳定版本,包含了对Linux和Windows操作系统的支持。 在AStyle 3.1中,开发者可以享受到以下主要功能: 1. **代码格式化**:AStyle可以自动调整代码的缩进、空格、括号对齐、换行以及...

    实例代码详解正则表达式匹配换行

    在Unix/Linux系统中,换行符通常是一个字符(`\n`),而在Windows系统中,换行符通常是由两个字符组成的回车换行序列(`\r\n`)。在编写跨平台的正则表达式时,需要考虑到这一点。 在给出的实例代码中,我们看到...

    linux编程_makefile.pdf

    【描述】:本文档详细介绍了Linux编程中Makefile的概念、作用以及编写规则,旨在帮助读者理解和掌握如何利用Makefile自动化编译项目。 【标签】:技术 【正文】: Makefile是Linux和其他类Unix系统中用于自动化...

    AStyle_2.02.1_windows.zip

    总的来说,AStyle_2.02.1_windows.zip提供了完整的AStyle工具包,无论是初次使用者还是高级开发者,都能从中找到所需的信息和资源。通过合理使用AStyle,可以极大地提升代码质量,减少因格式不统一而产生的代码审查...

    Astyle 3.01 Windows XP可用

    MinGW是一种将GCC(GNU Compiler Collection)移植到Windows平台的开源项目,它为Windows提供了类UNIX的开发环境,使得开发者能够在Windows上构建和运行原本为Linux或Unix设计的程序。 Astyle 3.01的关键特性包括:...

    astyle_3.1

    Astyle提供了一系列自定义选项,允许开发者根据项目需求或个人喜好调整缩进方式(空格或制表符)、括号对齐、换行规则等。这对于维护大型代码库或接手他人代码时,尤其有帮助,可以快速统一代码风格。 在Linux环境...

    基于嵌入式Linux的嵌入式GIS的设计与实现

    NMEA0183是一种广泛使用的GPS串行通信协议,它定义了一系列标准的数据格式和通信规则。在实现GPS通信时,并不需要完全理解协议的所有细节,只需要关注基本的通信参数和所需信息的语句格式即可。 1. **基本通信参数*...

    php post换行的方法

    在HTML和大多数文本文件中,换行符可能并不总是显示为视觉上的换行,因为浏览器或文本编辑器可能会根据其设置或规则来解释换行符。在纯文本文件中,常见的换行符包括 "\n" (LF),"\r" (CR) 以及 "\r\n" (CRLF)。 在...

    astyle_2.05.1_linux.tar.gz

    2. **跨平台支持**:尽管压缩包名字中包含了"linux",但Astyle实际上支持多种操作系统,包括Windows、Mac OS X以及各种Linux发行版,体现了其跨平台的特性。 3. **SourceForge**:Astyle是在SourceForge上托管的...

    GNU C代码格式化工具Indent Windows可执行文件

    同时,由于Windows系统与Unix/Linux系统在头文件包含路径上的差异,你可能需要修改源代码中包含的头文件路径,使其适应Windows环境。 为了顺利运行这个可执行文件,你需要确保你的系统已经安装了VC++ 6.0运行时库,...

    Irrlicht 中文支持引擎

    这可能涉及到字形的大小调整、换行规则以及文本流的方向(从左到右或从右到左)。 3. **用户界面**:游戏或应用的用户界面经常需要显示中文文本,例如菜单、提示信息和对话。Irrlicht引擎应能提供接口让开发者方便...

    windows下上传shell脚本不能运行的解决方法

    Windows使用的是CRLF(Carriage Return Line Feed,回车换行)作为行结束符,而Linux系统则采用LF(Line Feed,换行)作为行结束符。当一个在Windows环境下创建的shell脚本被上传到Linux服务器时,这些CRLF字符在...

    文本文件和二进制文件区别读写.rar

    文本文件读写的一个关键特点是行结束符,如CRLF(回车换行)在Windows系统中,LF(换行)在Unix/Linux系统中。在跨平台操作时,需要特别注意这些差异。而二进制文件则没有固定的行结束符概念,它直接保存原始数据的...

    Source Insight代码格式化工具 AStyle_3.1_windows

    AStyle提供了一系列可配置的选项,允许用户自定义缩进方式(空格或制表符)、缩进宽度、换行规则等,以满足不同项目或团队的编码标准。 **AStyle的安装与使用** 1. 首先,从提供的压缩包文件"AStyle"中解压出...

Global site tag (gtag.js) - Google Analytics