回车(Carriage Return)和换行(Line Feed)概念:
以上的概念只适用于打字机,现代计算机沿用的时候主要使用的是 回到行首
和 换行+回到行首
的功能。看下面的例子:
1、在Windows下应用程序输出/n到文件,会被自动转换成/r/n
// output:
// first line
// second line
printf("first line/nsecond line");
// test.txt output;
// first line/r/nsecond line
std::fstream fout("test.txt", std::ios::out);
if (fout.is_open())
{
fout.write("first line/nsecond line", sizeof("first line/nsecond line"));
fout.close();
}
2、在windows下应用程序输出/r到文件,不会被转换,并且并不会起到“将光标移动到当前行开头”的作用
// output:
// second line
printf("first line/rsecond line");
// test.txt output;
// first line/rsecond line
std::fstream fout("test.txt", std::ios::out);
if (fout.is_open())
{
fout.write("first line/rsecond line", sizeof("first line/rsecond line"));
fout.close();
}
3、在Windows下应用程序输出/r/n到文件,/r/n会被自动转换成/r/r/n
// output:
// first line
// second line
printf("first line/r/nsecond line");
// test.txt output;
// first line/r/r/nsecond line
std::fstream fout("test.txt", std::ios::out);
if (fout.is_open())
{
fout.write("first line/r/nsecond line", sizeof("first line/r/nsecond line"));
fout.close();
}
CR、LF、CR/LF为不同操作系统上使用的换行符:
CR使用符号’/r’,十进制ASCII代码是13,十六进制代码为0x0D;LF使用’/n’符号表示,ASCII代码是10,十六制为0x0A。所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示,而UNIX和苹果平台上换行则是使用 0a 或 0d 一个字节表示。
Unix/Linux/Mac系统下的文件在Windows里打开的话(使用Windows自带记事本),会出现换行丢失,所有文字会变成一行,整个文本会乱成一团。Windows系统下的文件在Unix/Linux/Mac里打开的话,在每行的结尾可能会多出一个^M符号。
目前大部分的编辑器和IDE都支持这几种换行符(除了notepad),但是跨平台协作项目源码到底保存为哪种风格的换行符呢?输出的文本需要保存为哪种风格的换行符呢?Git提供了一个解决方案——在跨平台协作场景时,会提供一个“换行符自动转换”的功能。
Git默认在提交时将Windows换行符(CRLF)转换为LF,在拉取时将UNIX换行符(LF)替换成CRLF。我们可以通过设置autocrlf和safecrlf来设置具体的操作。
1、autocrlf
// 提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true
// 提交时转换为LF,检出时不转换
git config --global core.autocrlf input
// 提交检出均不转换
git config --global core.autocrlf false
2、safecrlf
// 拒绝提交包含混合换行符的文件
git config --global core.safecrlf true
// 允许提交包含混合换行符的文件
git config --global core.safecrlf false
// 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn