vim的vim 换行符符在内部存的是<nl>还是<cr>?

15380人阅读
[ &游客& &发表于&& 18:55&&]
[ &游客& &发表于&& 18:59&&]
[ &游客& &发表于&& 19:00&&]
IT文摘 11:40:24阅读86评论0&&字号:大中小&订阅
如果你有在windows下编程的经验就会发现windows下敲下回车键会产生两个字符CR和LF,用16进制编辑器打开windows下的文本文件也会看到换行是0D和0A表示的,也就是CR和LF的ASCII编码。而在UNIX类系统中换行只有一个字符LF,所以UNIX中的文本文件在windows中用记事本打开会出现不可解析字符且丢失换行&#26684;式,所有字符连成一行。
&&& 因为windows下的记事本读到LF时不知道这就是换行(只有CR和LF连续出现才能解释为换行),于是当作不可打印字符处理,就是一个黑色方框。CR和LF分别表示“回车”(carriage return)和“换行”(line feed),ASCII编码为13和10,在C语言中用\r和\n表示。
&&& 为什么windows下要用两个字符表示换行?这就是今天要讲的故事:《回车的传说》
&&& 在计算机刚刚诞生之时,广泛使用Teletype公司制造的一种古老的终端(console terminal)电传打字机ASR33。ASR33每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,打印头从行尾移到行首再下移一行要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失,那时可没有缓冲区暂存。Teletype的研究人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
( 1968年盖茨在湖滨中学玩的就是这种机器,他们通过这种终端编写BASIC程序。因为 ASR 33只使用大写字母,所以BASIC程序以大写字母为主)
&&& 后来,计算机的史前时代结束了,小型机诞生了,现代文明的键盘也发明了,但回车和换行的概念仍被保留下来。一些计算机设计者认为在每行结尾加两个字符太浪费也没有必要了,加一个就可以。于是就出现了分歧。
&&& Unix系统里使用&line feed&表示换行,每行结尾只有一个换行符\n,MSDOS和Windows系统里面每行结尾是&回车&&换行&(&carriage return&&line feed&)即\r\n,Apple的Mac系统里每行结尾是&回车&(&carriage return&)即\r。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,某些文本编辑器可能在每行的结尾会多出一个^M符号。
&& 本人觉得用两个字符表示换行实在有些画蛇添足,但是在网络的世界里这一现象却大量存在,不少网络协议规定报文必须使用CR-LF换行模式。
你怎么看呢?前不久在CU的论坛对这一问题进行了讨论:http://bbs2.chinaunix.net/thread--1.html
这个和编程有关系吗?
有的,但是在标准C里通常情况下是体会不到的,标准C的流提供系统无关抽象层。
可以在windows系统中进行一下实验:
----------------------------------------------
#include &stdio.h&
int&main(void)
&&&&&&&&int&i;
&&&&&&&&FILE&*
&&&&&&&&if((fp=fopen(&test.txt&,&w&)) == NULL)&&&&
&&&&&&&&&&&&&&&&fprintf(stderr,&open file error\n&);
&&&&&&&&&&&&&&&&return&1;
&&&&&&&&for(i=0;i&100;i&#43;&#43;)
&&&&&&&&&&&&&&&&fprintf(fp,&test\n&);
&&&&&&&&fclose(fp);
&&&&&&&&return&0;
-------------------------------------------------------------------------------------
#include &stdio.h&
int&main(void)
&&&&&&&&int&i;
&&&&&&&&FILE&*
&&&&&&&&if((fp=fopen(&test.bin&,&wb&)) == NULL)&&&&
&&&&&&&&&&&&&&&&fprintf(stderr,&open file error\n&);
&&&&&&&&&&&&&&&&return&1;
&&&&&&&&for(i=0;i&100;i&#43;&#43;)
&&&&&&&&&&&&&&&&fprintf(fp,&test\n&);
&&&&&&&&fclose(fp);
&&&&&&&&return&0;
--------------------------------------------------------------------------------------
程序一输出文件大小是600字节,程序二输出文件大小是500字节,用记事本打开程序一的输出没有什么问题,每行一个test,打开程序二的输出发现所有的test连成一行,test之间是一个黑色方框符号分隔。用UltraEdit-32以16进制编辑模式打开test.bin可以查看到黑色方框符号就是0A也就是\n,打开test.txt则会发现换行是\r\n,这就是两个文件大小相差100字节的原因。Unix类系统用户打开windows中的文件就会遇到这种苦恼。
为什么会有这种区别呢?
&&& 毕竟是源自Unix系统,C语言中使用\n表示换行,而在实际的文件中换行符号需要同操作系统一致,所以当我们在C中使用fopen打开一个文本文件时流实现了实际换行符与C中\n之间的转换。在windows中当我们用fopen打开文本文件,然后从中读到\r\n时流会转换为\n,而当我们往文件中写入\n时流会转换为\r\n。程序一是打开文本文件,程序二打开的是二进制文件,因为流只对文本文件进行换行表示的转换,以二进制模式打开流不会做任何处理。所以当你以二进制模式打开一个文本文件时将产生错乱,你必须亲自将\r\n解释为\n,同样的问题也会出现在以文本模式打开二进制文件的情况.这也解释了为什么Unix类系统中的文件不区分文本文件和二进制文件的原因。
当我们使用标准输入输出函数时有这种情况吗?&
再回到我们熟悉的标准输入输出stdin,stdout
&&& C的控制台程序在加载进内存成为进程运行前C运行时库自动打开三个设备并关联到三个流:标准输入流stdin,标准输出流stdout,标准出错流stderr
&&& 通常在通用计算机中,没有重定向前这三个流对应的设备是:键盘,显示器,显示器。这三个都是字符设备,所以是以文本文件的模式打开的,在windows下当我们在键盘上敲入回车键时产生字符\r\n,但是在OS内核把键盘驱动中读到的字符发送给流的缓冲区时流会将之转换为\n,当我们向控制台输出\n时流将之转换为\r\n再传递至内核,当我们绕过标准输入输出直接调用windows中coredll.lib进行控制台输入输出时就必须面对这一现实,程序员负责实现这一转换。
不同计算机上c语言统一规定为:
文本文件的行结束符一律变成一个符号LF,也就是换行符,也就是new line符, 也就是'\n'.
“回车和换行符转换成一个换行符”-- 对PC机而言,文本文件行结束符,CRLF读入后,丢掉CR,留&& LF.
例如fgets() 读入一行,行尾只有LF,没有CR.
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:61401次
排名:千里之外
原创:36篇
转载:26篇
评论:10条
(2)(3)(1)(6)(1)(3)(2)(4)(1)(1)(1)(1)(5)(2)(1)(1)(4)(3)(2)(3)(4)(1)(2)(6)(3)(1)vi/vim使用进阶: 使用会话和viminfo | 易水博客5188人阅读
1. 回车与换行符的起源
在打字机时代, 回车(CR, Carriage Return)指打印针回到行首, 换行(LF, Line Feed)指打印针移到下一行. 当计算机出现时, 发现不再需要两个字符来表示换行符, 所以UNIX和Mac平台均只有一个字符来表示换行符, 而Windows沿用了打字机的换行方式. 如果用十六进制的ASCII&#20540;表示, LF是0X0A, CR是0X0D.
1. Windows平台的换行符
Windows平台的换行符是CR&#43;LF. 十六进制的ASCII&#20540;为0D0A. 在Windows系统中新建一个文本文件test.txt, 使用内置的记事本打开它, 键入如下的代码:
int main() {
使用可以查看十六进制的编辑器(如), 打开text.txt, 进入十六进制模式, 即可看到其换行的&#2A):
或者使用查看其换行符:
2. UNIX & Mac OSX平台的换行符
UINX平台的换行符是LF(0X0A). 在ubuntu linux下使用vi键入上述相同的代码, 查看其十六进制的数据:
使用Notepad&#43;&#43;查看其换行符:
Mac OSX平台的换行符目前我还没有设备去测试.
3. MAC (OS-9及更早版本)平台的换行符
换行符为CR(0X0D). 本人没有亲自测试.
4. 不同平台间的换行符转换
请参考另一篇博文:
References:
http://www./Line&#43;termination&#43;line&#43;feed&#43;versus&#43;carriage&#43;return&#43;0d0a
http://www./carriage&#43;return&#43;and&#43;line&#43;feed&#43;linefeed&#43;problems
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:248971次
积分:3959
积分:3959
排名:第3971名
原创:163篇
评论:64条
职&&&&业:coder 兴趣方向:C, C&#43;&#43;, Linux/Unix 目前在做:coding 所在城市:南&&京
(1)(2)(2)(2)(2)(1)(2)(2)(3)(7)(11)(5)(3)(5)(3)(2)(2)(3)(4)(1)(3)(2)(1)(8)(22)(7)(5)(4)(1)(7)(10)(8)(6)(20)(2)(1)}

我要回帖

更多关于 vim删除换行符 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信