lfcrlfjava的简单介绍
本篇文章给大家谈谈lfcrlfjava,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、BAT中如何变化文件的换行符,实现LF变成CRLF
- 2、vscode 中的LF CRLF
- 3、CRLF、CR、LF详解
- 4、如何用Java或C语言解析二进制文件为文本文件?
- 5、文本文件中的行分隔符
- 6、CRLF和LF有什么区别?
BAT中如何变化文件的换行符,实现LF变成CRLF
百度搜索“白杨免费”结果中第一个网页里面找一个wfr工具(wide find - replace)
LF变成CRLF的命令应该是
wfr a.txt -r:"\n" -t:"\r\n"
vscode 中的LF CRLF
\n 、\r\n 换行还是回车换行
本文参考自:
我们打开Visual Studio Code编辑器,可以看到右下角有这个LF,这是VS Code的默认行尾序列的符号:
点开后,我们可以到,有两种模式可选,LF,CRLF:
为什么是这样呢,这两种模式有什么区别呢?
在Linux下,默认换行的话,是LF模式,见下图两个红框部分:
Linux下创建的LinuxFIle文件,用Linux的编辑器在里面写了三行文本。然后我用Python显示出转义符,可以看到是\n,这里的\n就是指的是 换行符(LF)
然后我们在Windows下用记事本,写一个文件WindowsFile.txt,然后上转到Linux上去同样的方法查看。可以看到是\r\n,\r指的就是 回车(CR) ,\r\n连起来就是 回车换行(CRLF)
也就是说:在Linux里编辑文件,一行结束后跟的是\n;在Windows里用自带的记事本编辑文件,一行结束后跟的是\r\n
tips:在Windows下有很多编辑器,是默认支持LF的方式,如Visual Studio Code、Sublime Text、Notepadd++,而且默认的编码格式是UTF-8,所以,大家在Windows下写Linux脚本,或打开Linux下的文件,可以用上面的编辑器,而不要用Windows自带的记事本。
CR和LF是缩写,其实他们的全称分别是:Carriage-Return和Line-Feed。追本溯源的说,CR(Carriage-Return)和LF(Line-Feed)这两个词来源于打字机的发明和使用。
打字机的纸张向下卷动一行,就是 换行(LF, Line-Feed)
将打印头从最右边归位到最左边,就是 回车(CR, Carriage-Return)
如果把一个Windows记事本建立的文档,放到Linux里用的话,要用dos2unix来转换一下后,再使用。当然最好的方法还是用专门的编辑器,不要用记事本。
CRLF、CR、LF详解
众所周知,Windows操作系统采用两个字符来进行换行,即CRLF;Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;另外,MacIntosh操作系统(即早期的Mac操作系统)采用单个字符CR来进行换行。
据野史记载,在很久以前的机械打字机时代,CR和LF分别具有不同的作用:LF会将打印纸张上移一行位置,但是保持当前打字的水平位置不变;CR则会将“Carriage”(打字机上的滚动托架)滚回到打印纸张的最左侧,但是保持当前打字的垂直位置不变,即还是在同一行。
当CR和LF组合使用时,则会将打印纸张上移一行,且下一个打字位置将回到该行的最左侧,也就是我们今天所理解的换行操作。
随着时间的推移,机械打字机渐渐地退出了历史舞台,当初的纸张变成了今天的显示器,打字机的按键也演变为了如今的键盘。在操作系统出现的年代,受限于内存和软盘空间的不足,一些操作系统的设计者决定采用单个字符来表示换行符,如Unix的LF、MacIntosh的CR。他们的意图都是为了进行换行操作,只是当初并没有一个国际标准(或者其他原因,鬼知道),所以才有这样字符上的不同。
许多现代的文本编辑器和命令行工具都提供了可选择的换行符配置,方便用户按照自己的意愿来改变换行符的表现形式,所以我们只需要知道CRLF、CR、LF的作用即可。
如何用Java或C语言解析二进制文件为文本文件?
在学习C语言fopen()函数后,知道它的第二个参数是标志字符串。如果字符串中出现'b',则表明是以打开二进制(binary)文件,否则是打开文本文件。
那么什么是文本文件,什么是二进制文件呢?
从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。
ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为:
ASC码: 00110101 00110110 00110111 00111000
↓ ↓↓ ↓
十进制码: 5 678
共占用4个字节。ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。
二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。
文本文件与二进制文件的区别在系统存储上它们实际上并没有什么区别,都是以二进制的方式存储于硬盘上。之所以分二进制文件和文本文件,主要是逻辑上的区分,文本文件更人为可读而已。站在编程的角度看,文本文件是基于字符编码过后的,比如常见的就有ascii编码,gbk编码,unicode编码等,文本工具直接打开人为可读。而二进制文件是基于值的编码,这个值到底是什么,完全可自定义,所以可以说二进制文件是一种特殊编码的文件。如果用java编程,可能就根本没遇到过以二进制打开和文本文件打开这两种方式。java里面有字符流和字节流,字符流是对字节流的封装,有编码解码,而字节流操作的则是byte数组,所以更容易理解。python的文件读写方式则更贴近C。因为python和java他们底层都是C,所以很有必要弄清C的读写文件方式。
在Windows和DOS系统中,狭义的文本文件是指扩展名为txt的文件。实际上,那些没有规定格式的,由可理解的的ASCII以及其他编码文字组成的文件都是文本文件,如C源程序文件,HTML超文本,XML。除此之外的其他文件都是二进制文件,如Word文件DOC,图象格式文件JPG。
实际上,fopen()的 b 标志不但可以打开二进制文件,还可以打开文本文件,同样,不带 b 标志也可以打开文本文件。
既然这样,为什么还要区分两种打开方式呢?
因为这两种方式在读写文件时的操作是不一样的。
二进制方式很简单,读文件时,会原封不动的读出文件的全部内容,写的时候,也是把内存缓冲区的内容原封不动的写到文件中。
而文本方式就不一样了,在写文件时,会将换行符号CRLF(0x0D 0x0A)全部转换成单个的0x0A,并且当遇到结束符CTRLZ(0x1A)时,就认为文件已经结束。相应的,写文件时,会将所有的0x0A换成0x0D0x0A。
所以,若使用文本方式打开二进制文件时,就很容易出现文件读不完整,或内容不对的错误。即使是用文本方式打开文本文件,也要谨慎使用,比如复制文件,就不应该使用文本方式。
要特别注意的是,上面这样的说法仅适用于DOS和Windows系统。在Unix和其他一些系统中,没有文本方式和二进制方式的区分,使不使用'b'标志都是一样的。这是由于不同操作系统对文本文件换行符的定义,和C语言中换行符的定义有所不同而造成的。
如上文已提到,DOS和Windows系统使用CRLF(0x0D 0x0A)即\r\n双字节作为文本文件换行符,而Unix文本文件的换行符只有一个字节LF(0x0A)为。在C语言中,也是以LF即'\n'为换行符。
由于DOS/Windows定义的换行符和C语言的不一致,C语言的标准输入输出函数适行读写文本文件时,就适行了CRLF-LF的转换。而Unix的定义和C语言的是一样的,就不必转换了。
那么,为什么会有定义不一致的情况呢,这纯属历史原因。当初C是在Unix上发展的,对换行的定义自然就一样了。其后C被引入到DOS系统,为了使原有的C程序能不加修改的读写DOS的文本文件,所以就在文件读写上做了修改。随着DOS/Windows成为主流平台,这个当初为了兼容而做的修改给众多的C语言开发者添了这样一个小小的麻烦。
所以,二进制和文本模式的区别就在于对于换行符和一些非可见字符上面的转化,所以安全起见,是使用二进制读取会比较安全一些。
文本文件中的行分隔符
这可能是关于换行符最全面的一篇文章。即使现在不是,后面也会将新的内容补充进来,让它成为最全面的一篇。
当我们用一个编辑器打开一个文本文件,在其中输入 一个 字符'a',这时候,就会有 一个 对应的字符'a'的编码(如果编码格式是ACII码,那么这里记入的编码就是“97”,写成16进制就是“0x61”)记入到该文件中。类似的输入 一个 'b',文件中便会记入一个对应的字符'b'的编码。然而,如果我们按下键盘上的‘Enter’键,现象上看,文本内容发生了换行。但是,这时候,对应的文件中究竟记入了什么内容,来标记文件发生了换行呢?
实际上,对于这个问题,不同的操作系统,沿用了不同的操作传统。如下:
注:
Mac OS 9 以及之前的系统的换行符是CR,从Mac OS X (后来改名为“OS X”)开始的换行符是LF即‘\n',和Unix统一了。
不同平台的换行符不同,会导致的各种异响不到的问题。比如:Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
如果只是将文件在编辑器中打开,供人肉眼阅读,这个问题还是挺好处理的。换一个更加智能的编辑器就好了。有的编辑器能够自动识别行分隔符,有的甚至允许用户自己指定行分隔符。这里面我遇到的对这个问题处理最好的编辑器,是JetBrains公司出的Java集成开发环境IntelliJ IDEA。
在打开文本文件的左下方,标签标识当前文件的行分隔符,鼠标点击,会弹出一个上拉列表,允许用户修改不同的行分隔符,非常方便。(类似地,文件编码的修改也在这个位置,不能更好用了。)
比人肉眼阅读麻烦的是,写程序处理文本文件的时候。一个按行处理文本文件的程序可能能够正确处理Windows上生成的文本文件,但是换成一个平台上产生的文件,可能就无法正确运行。这时候,可能就需要先识别是不是文件的分隔符导致的问题,然后,决定是不是要做必要的转换。
上面已经提到过了,更加智能的编辑器肯定是能够识别行分隔符的。但是,很多时候,我们有的只是一个终端、命令行。所以,这部分主要介绍如何通过命令来识别行分隔符。
如果能看到文件存储的二进制字节,自然可以知道文件的行分隔符是什么,图形化的智能编辑器大部分都自带这个功能。命令行下也有好多工具可以查看文本文件的16进制输出,这里以xxd命令为例介绍(如下测试,连同本文的其他测试都是在 macOS Mojave 版本号10.14.1 环境下执行的)。
上面的命令中 -g1 的参数是指一个字节为一组查看16进制编码。从命令的结果可以看出,该文件的行分隔符是0a,也就是 \n 。xxd命令输出的右边 a.b.c. ,是带表文件文本内容,其中的点就是带表不可打印字符 \n 。而在下面的执行结果中,不难看出文件b.txt的行分隔符是 \r\n 。
有的操作系统发行版中,自带的命令行中没有上面的xxd工具,通过cat命令其实也可以查看文本文件的行分隔符。如下是cat命令各个选项的解释:
可以看出 -A 选项的作用就是在文件每行结尾显示 $ ,同时显示除了LF( \n 换行符)和TAB之外的所有不可打印字符。如下是从维基百科扒下来的不可打印字符列表:
可以看出mac系统自带的命令行cat工具不支持 -A 选项。不过,在支持的系统上,配合head命令,可以看出如果文件的换行符是 \n 输出行的末尾只会有一个 $ ,如果换行符是 \r\n ,输出行的末尾就会是 ^M$ 。从上面cat命令的解释也不难看出这一点。
如果确定了是行分隔符的导致的问题,有时候,就需要进行行分隔符的转换。最简单的方式,可能是上面提到的像IDEA那样的更加智能的图形化文本编辑器,在界面上点点点操作几下就完成了。然而,这不见得是最方便的,比如在命令行的环境中,除了命令一无所有。因此,这里着重介绍命令行下的解决方案。
提到命令行下的文件编辑sed命令肯定是绕不过去的。如果要将行分隔符从 \n 换成 \r\n 最直觉的写法可能是( -i 选项的意思是直接在原文件上进行编辑):
然而这个方法,却屡试屡败。原因就在于sed命令是按照行来读文件的,逐行处理,默认地sed认为行分隔符是 \n ,所以,不会出现在sed处理的文本行内容中,导致这个方案失败。所以,可能的解决办法就是将所有文件内容读进来处理,而不是逐行处理。解决的办法大概有如下几个:
既然sed处理的文本行中不包含换行符,我们可以用 $ 来辅助实现替换:
但是,在我的系统上,这样写的效果却是:
这里之所以 -i 选项后面加 '' 是因为这个系统上sed要求 -i 时,必须指定扩展。然而,仍然运行失败的原因在于macos没法像Linux那样将 \r 识别为特殊字符。为了给sed传入 \r 需要写成:
这里 $'' 的作用就是让其中的转义字符正确被翻译。同样的,用 $() 也可以达到这个效果,不过外面的单引号要换成双引号。
对于GNU版本的sed,可以使用 -z 选项。
下面是一个例子:
对于GNU版本的sed,也可以写一个循环,将文件全部读入之后,再交给sed处理:
到这里,换行符的识别、转换等都介绍完了。这里讲最后一个之前令我困扰的问题, ^$\r\n 这几个符号在正则匹配中的先后顺序是什么。这里,直接贴下正则表达式网站上的介绍:
也就是说,Delphi、Java和JGsoft风格的正则将CRLF看成一个整体, ^ 匹配CRLF后面, $ 匹配CRLF前面,两者都不匹配CRLF中间。而JavaScript和XPath认为CRLF是两个换行符, ^ 匹配CRLF中间和后面, $ 匹配CRLF中间和前面。
CRLF和LF有什么区别?
以下几个方面存在区别,如下:
1、概念方面:
回车CR-将光标移动到当前行的开头。
换行LF-将光标“垂直”移动到下一行。(而并不移动到下一行的开头,即不改变光标水平位置)
2、代码不同:
回车CR用符号'\r'表示, 十进制ASCII代码是13, 十六进制代码为0x0D。
换行LF使用'\n'符号表示, ASCII代码是10, 十六制为0x0A。
3、操作方式不同:
Dos和windows采用回车+换行CR/LF表示下一行,而UNIX/Linux采用换行符LF表示下一行,苹果机(MAC OS系统)则采用回车符CR表示下一行。
所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示。
扩展资料:
回车符和换行符的起源:
在计算机还没有出现之前,电传打字机(Teletype Model 33,Linux/Unix下的tty概念也来自于此),每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历。
参考资料:
百度百科--换行符
百度百科--CRLF(回车)
关于lfcrlfjava和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。