趣谈、浅析CRLF和LF
作为程序员,在处理文件和输入输出的时候经常要跟CRLF和LF打交道。可能大家多少知道一些,但总是记不清楚,我也是这样的,因此写下这篇博文,作为记录。
首先,明确他们的意思:CR(回车),LF(换行)。是不是有点别扭,有点难记?下面的趣谈能帮助大家记忆:
CR和LF是缩写,其实他们的全称分别是:"Carriage-Return"和"Line-Feed"。追本溯源的说,CR(Carriage-Return)和LF(Line-Feed)这两个词来源于打字机的发明和使用。
如果大家看过故事背景比较老的电影或者电视剧,那么对这个家伙如何工作会有一定的印象:当你用一个打字机的时候,asdfghjkl;'右边的那个按钮(在计算机键盘上,就对应着Enter键)被按下的时候,打字机的纸张卷动一行,而纸张的水平位置并不变化。打字机上另外还有一个手柄,那个手柄是专用来回车的,向左搬动那个手柄的时候,装纸的结构被松开,在弹簧的作用下弹回最右边(相当于打印头回到最左边)。所以当我们要换行的时候,实际需要两步操作,回车+换行(或者反过来)。
因此,打字机的纸张卷动一行,就是换行(LF, Line-Feed),再看看这个单词,有没有觉得很形象?Line-Feed就是往打字的地方“喂”了一行。
而将打印头从最右边归为到最左边,就是回车(CR, Carriage-Return),其实单词的字面意思就是“倒(马)车”嘛,真的很形象!有人可能会问,为什么CR里的"C"是"Carriage(马车)"而不是"Car(汽车)"呢?
因为打字机发明的时候,汽车还没发明嘛!
言归正传,为什么我们会遇到各种关于CRLF的问题呢?
在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符.
Dos和windows采用回车+换行CR/LF表示下一行,
而UNIX/Linux采用换行符LF表示下一行,
苹果机(MAC OS系统)也采用换行符LF表示下一行。(注:有些人认为Mac Style是CR,我查了一些资料,发现应该是这样的:老的Mac是CR,后来的OSX全部改成了LF)
CR用符号’\r’表示, LF使用’\n’符号表示。
一般操作系统上的运行库会自动决定文本文件的换行格式。 如一个程序在windows上运行就生成CRLF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件。
在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题, 特别是在编辑程序代码时. 有时候代码在编辑器中显示正常, 但在编辑时却会因为换行符问题而出错。
很多文本/代码编辑器带有换行符转换功能, 使用这个功能可以将文本文件中的换行符在不同格式单互换。
在不同平台间使用FTP软件传送文件时, 在ascii文本模式传输模式下, 一些FTP客户端程序会自动对换行格式进行转换. 经过这种传输的文件字节数可能会发生变化. 如果你不想ftp修改原文件, 可以使用bin模式(二进制模式)传输文本。
另外,在使用github时,我们可能会遇到这样的设置问题:
在学习git软件,安装git到configuring the lien ending conversion时,有三个选项。
a.Checkout Windows-style,commit Unix-style line endings.
b.Checkout as-is,commit Unix-style line endings.
c.Checkout as-is,commit as-is line endings.
这里面讲到了做两个操作(Checkout,Commit)的三种处理line endings的操作(Windows-style,Unix-style,As-is)。
为什么会出现这三种处理line endings(行尾结束符)呢?在Git的帮助页面给出了很好的解释。
Reference From:https://help.github.com/articles/dealing-with-line-endings
If you're using Git to collaborate with others on GitHub, ensure that Git isproperly configured to handle line endings.
Every time you press return on your keyboard you're actuallyinserting an invisible character called a line ending . Historically, differentoperating systems have handled line endings differently.
When you view changes in a file, Git handles line endings in its own way.Since you're collaborating on projects with Git and GitHub, Git mightproduce unexpected results if, for example, you're working on a Windows machine,and your collaborator has made a change in OS X.
意思很好理解,就不翻译了。重视由于历史的原因,各种不同的操作系统在处理行尾结束符采取了不同的处理方法。而Git和GitHub
三种处理方式的不同:
CRLF->Windows-style
LF->Unix Style, Mac Style(注:有些人认为Mac Style是CR,我查了一些资料,发现应该是这样的:老的Mac是CR,后来的OSX全部改成了LF)
CRLF表示句尾使用回车换行两个字符(即我们常在Windows编程时使用"\r\n"换行)
LF表示表示句尾,只使用换行.
CR表示只使用回车.
在Git中如何转换?
在Git通过下面的命令配置
$git config --global core.autocrlf true
# Configure Git on Windows to properly handle line endings
解释:core.autocrlf是git中负责处理line endings的变量,可以设置三个值--true,inout,false.
设置成三个值会有什么效果呢?
If core.autocrlf
is set to true, that means that any time you add a file to the git repo that git thinks is a text file, it will turn all CRLF line endings to just LF before it stores it in the commit.。
设置为true,添加文件到git仓库(即提交代码)时,git将其视为文本文件。他将把crlf变成lf。
If core.autocrlf
is set to false, no line-ending conversion is ever performed, so text files are checked in as-is. This usually works ok。
设置为false时,line-endings将不做转换操作。文本文件保持原来的样子。
设置为input时,添加文件git仓库(即提交代码)时,git把crlf编成lf。当有人Check代码(即从git仓库迁出代码)时,按照input的方式,即不做修改,完全照搬git仓库里的。因此在window操作系统下,尽量不要使用这个设置。
Yet another way to show how autocrlf
works
1) true: x -> LF -> CRLF
2) input: x -> LF -> LF
3) false: x -> x -> x
where x is either CRLF (windows-style) or LF (unix-style) and arrows stand for
file to commit -> repository -> checked out file
其实总结起来,如果设置autocrlf=false,那么文本文件在git仓库里存储和被人check时都不做任何改变,依然保持原来的line-ending。而设置为true或input,其共同点为文本文件在git仓库里line-ending修改为lf,不管原来是什么样的line-ending。不同点为autocrlf=true会在有人Check代码(即从git仓库迁出代码)时把代码line-endings转换为CRLF,而autocrlf=input不会对line-endings做任何改变。
因此,如果你编辑代码的系统为windows,就要设置autocrlf=true。如果你编辑代码的系统为Linux/Mac,就要设置autocrlf=input.
参考文献:
1、百度百科 "CRLF" http://baike.baidu.com/link?url=scpmj275A8qM1JE0lCgLq0CRNp0ruiXg0t2Szno0cTCAvYwkXOzLbIAJMFNFL_i7kHumKILySfU2sMN5tMp71K
2、百度知道 "什么是CR和LF" https://zhidao.baidu.com/question/918032703926589059.html
3、"CR,LF,CR\LF,回车,换行" http://www.cslog.cn/Content/cr-lf-crlf-new-line-enter/
4、"CRLF和LF" http://www.tuicool.com/articles/IJjQVb
5、Git换行符之autoCRLF配置的意义 http://www.cnblogs.com/yepei/p/5650290.html
6、自定义Git-配置git https://git-scm.com/book/zh/v1/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-%E9%85%8D%E7%BD%AE-Git
趣谈、浅析CRLF和LF的更多相关文章
- [转]ASP.NET应用程序生命周期趣谈(五) IIS7瞎说
Ps:建议初学者在阅读本文之前,先简要了解一下之前的几篇文章,以便于熟悉本文提到的一些关于IIS6的内容,方便理解.仅供参考. PS:为什么叫瞎说呢?我觉得自己理解的并不到位,只能是作为一个传声筒,希 ...
- [转]ASP.NET应用程序生命周期趣谈(三) HttpModule
在之前的文章中,我们提到过P_Module(HttpModule)这个能干的程序员哥们儿,它通过在项目经理HttpApplication那里得到的授权,插手整个应用程序级别的事件处理.所有的HttpM ...
- eslint 关于CRLF或者LF报错
在拉取项目代码时,如果有eslint代码校验,但是本地打开会有于CRLF或者LF报错报错,那么怎么处理呢? git有个自动转换换行符功能,在文件commit时会自动转换换行符格式: 不想使用,也可以通 ...
- Git 换行符检查 CRLF 与 LF
遇到的问题 在 git 提交或是签出时,提示如下问题: [git] warning: LF will be replaced by CRLF | fatal: CRLF would be replac ...
- 趣谈生成函数 =v=
趣谈生成函数 =v= 今天luyouqi在洛谷随机跳题rand出来一道生成函数板子题,然后我给做了(雾 发现小伙伴们还不会生成函数,于是我试着写这篇生成函数简介.(其实我也不怎么会生成函数这么高级的东 ...
- [git] warning: LF will be replaced by CRLF | fatal: CRLF would be replaced by LF[ git 处理和修改行结束符(CRLF和LF)]
我自己的设置是: [core] autocrlf = false[core] safecrlf = true 取消自动转换CRLF(上图中选的是commit as is),但是有提交前混用检查 本人用 ...
- 解决crlf 和 lf不同带来的冲突问题
crlf 和 lf 是文本换行的不同方式: crlf: "\r\n", windows系统的换行方式 lf: "\n", Linux系统的换行方式 他们之间的不 ...
- 深挖计算机基础:趣谈Linux操作系统学习笔记
参考极客时间专栏<趣谈Linux操作系统>学习笔记 核心原理篇:内存管理 趣谈Linux操作系统学习笔记:第二十讲 趣谈Linux操作系统学习笔记:第二十一讲 趣谈Linux操作系统学习笔 ...
- 《趣谈 Linux 操作系统》学习笔记(一):为什么要学 Linux 及学习路径
前言:学习的课程来自极客时间的专栏<趣谈 Linux 操作系统>,作者用形象化的比喻和丰富的图片让课程变得比较易懂,为了避免知识看过就忘,打算通过写学习笔记的形式记录自己的学习过程. Li ...
随机推荐
- JDBC学习笔记(2)
上一篇博客简单介绍了JDBC连接的简单知识,下面就详细介绍.李勇老师对JDBC连接有很好的比喻: 首先加载驱动,其实就是一些类,就是jar包,要加载到classpath里面的.实际的程序,服务和数据库 ...
- Scrum - BB项目日志
这是第三个Scrum团队开发,也是我首次担任Scrum Master一职.所以需要掌握的流程还是很多,也会碰到各种问题,在此记录一下,希望对以后有所帮助. Day1: 开了一次kick-off mee ...
- Android最大可运行内存
int maxMemory = (int) Runtime.getRuntime().maxMemory();
- Hive使用技巧
hive默认查询不会显示列名, 当一个表字段比较多的时候,往往看不出值与列之间的对应关系,对日常查错及定位问题带来不便,像下面这样. hive> >select * from exampl ...
- PYTHON学习之路_PYTHON基础(3)
学习内容: 1.Python字典 2.Python集合 3.Python字符编码 4.Python文件操作 5.Python实例 一.Python字典 1.定义: dic1={'name':'alex ...
- Cocoapods的安装,卸载和使用
[一]Cocoapods的安装 (1)Cocoapods的官方网站为: https://cocoapods.org/ .如果你的电脑已经安装了Ruby开发环境,那么在终端(Terminal)中使用以下 ...
- MySQL数据导出
1,打开命令行窗口“运行”-->输入CMD 2,进入自己MySQL Server安装目录的bin目录(我的安装目录如下) cd C:\Program Files\MySQL\MySQL Serv ...
- Python学习之路—Day1
第1章 Python语言简介 1.1 Python是什么 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn)是什么呢?简单的说,它是一种计算机编程语言及一组配套的软件工具和库. ...
- 从零开始学IOS开发
从今天开始开一个坑,由于业务变动,要开始学习IOS开发进行IOS app开发,其实鄙人本身就是一只菜鸟加大学狗,有过两年的C#,ASP.NET MVC,微信公众平台开发经验,一只在继续努力着,从大三下 ...
- [Xpand] Error 1 Invalid option '6' for /langversion; must be ISO-1, ISO-2, 3, 4, 5 or Default
原因是用的vs2015 默认用了c#6 ,但是在没安装.net 4.6 环境下编译失败. 解决办法很简单,修改 6 为 5 做降级就可以了. 1.nuget install DotNetCompile ...