windows和linux的换行规则有什么区别

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

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

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

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

Unix系统里,每行结尾只有"<换行>",即"\n";Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";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统计这个文件的行数:

时间: 2024-10-03 12:24:09

windows和linux的换行规则有什么区别的相关文章

windows和linux套接字中的select机制浅析

先来谈谈为什么会出现select函数,也就是select是解决什么问题的? 平常使用的recv函数时阻塞的,也就是如果没有数据可读,recv就会一直阻塞在那里,这是如果有另外一个连接过来,就得一直等待,这样实时性就不是太好. 这个问题的几个解决方法:1. 使用ioctlsocket函数,将recv函数设置成非阻塞的,这样不管套接字上有没有数据都会立刻返回,可以重复调用recv函数,这种方式叫做轮询(polling),但是这样效率很是问题,因为,大多数时间实际上是无数据可读的,花费时间不断反复执行

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

  在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符.但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符.要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失. 于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符.一个叫做"回车",告诉打字机把打印头定位在左边界;另一个叫做"换行",告诉打字机把纸向下移一行. 这就是"换行"和&

Windows与Linux换行符差别所引起的问题的解决方法

  windows和linux下的换行符是不同的.一般操作系统上的运行库会自动决定文本文件的换行格式. 如一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在linux上运行就生成LF格式换行的文本文件. 在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题, 特别是在编辑程序代码时. 有时候代码在编辑器中显示正常, 但在编辑时却会因为换行符问题而出错. 很多文本/代码编辑器带有换行符转换功能, 使用这个功能可以将文本文件中的换行符在不同格式单互换. 在不同平台间使用

windows 在文件中换行可以,在服务器Linux中不行

问题描述 windows 在文件中换行可以,在服务器Linux中不行 我差了2个字符串 用 File dowloadFile = new File(fielName);//path 为文件的所在地址out = new FileOutputStream(dowloadFile);p = new PrintStream(out);p.print(value);//写入数据p.println("" "");p.println("" "&quo

分析Windows和Linux动态库_unix linux

    摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系统的动态库由于格式 不同,在需要不同操作系统调用时需要进行动态库程序移植.本文分析和比较了两种操作系统动态库技术,并给出了将Visual C++编制的动态库移植到Linux上的方法和经验. 1.引言 动态库(Dynamic Link Library abbr,DLL)技术是程序设计中经常采用

几个Windows到Linux的代码移植问题

1.在 Linux 实现 Win32 API 之 GetTickCount 函数 为了将 Windows 中的 GetTickCount API 函数移植到 Linux,可以使用如下的代码: long GetTickCount() { tms tm; return times(&tm); } 2.Windows 和 Linux 系统关于 itoa 的移植问题 大家知道,在将 Windows 的 STL 代码移植到 Linux 系统时,由于 Linux 系统中 STL 没有实现默认的itoa 函数

Windows及Linux平台下的计时函数总结

本文对Windows及Linux平台下常用的计时函数进行总结,包括精度为秒.毫秒.微秒三种精度的各种函数. 比如Window平台下特有的Windows API函数GetTickCount().timeGetTime().及QueryPerformanceCounter(), Linux平台下特有的gettimeofday()函数,以及标准的C/C++函数time()和clock().下面分别对此进行简单介绍并附上示例代码. 通用的C/C++计时函数time()和clock() time_t ti

Oracle exp query条件检索在WINDOWS和LINUX下的命令区别

今天因为业务需要,运行了EXP的条件导出,发现WINDOWS和LINUX下有些差别,主要区别在于敏感字符,实例如下: LINUX: exp us/pass TABLES=\(t_ec_event\) file=/tmp/test.dmp QUERY=\"WHERE eventid =\'40288a2627f491080127fab7f17232b4\'\" WINDOWS: exp us/pass@test TABLES=(t_ec_event) file=test.dmp QUER

Windows和Linux下生成以当前时间命名的文件

  生成以当前时间命名的文件对于当今两大主流系统都十分有用,在 Windows.Linux 操作系统,分别利用BAT批处理文件和Shell脚本,生成类似"20110228_082905.txt"以"年月日_时分秒"命名的文件. Windows BAT批处理文件: @echo off set time_hh=%time:~0,2% if /i %time_hh% LSS 10 (set time_hh=0%time:~1,1%) set filename=%date: