Windows 系统和类 UNIX 系统在处理换行符的时候有些差异:

  • Windows 系统采用回车和换行两个字符来结束一行,即 \r\n 作为换行, 经常简称为 CRLF
  • 类 Unix 系统采用使用换行字符结束一行,即 \n 作为换行, 经常简称为 LF

在过去, Mac OS 使用回车字符结束一行, 即 \r, 简称为 CR, 但是现在最新的系统已经采用 LF 作为换行, 与所有类 UNIX 系统保持一致

如果经常需要在 Windows 和 类 Unix 系统上切换工作或者与其他人在不同系统间协同工作, 这些差异往往就会扰乱你(们)的跨平台协作, 比如在进行读写文件后, 发现文件显示 ^M 这样的字符; 比如 git 提交的时候, 可能在提交记录里面会出现整个文件都被更改的局面…

以 CRLF 作为换行符的文本文件经常被称作 DOS 格式文件, 而以 LF 作为换行符文本文件, 被称作 UNIX 格式文件

CRLF 还是 LF

如果进行跨平台的协同工作, 特别是使用 git 进行代码版本管理, 最好统一换行符, 建议使用 LF(即\n) 作为换行符

使用 file 命令查看 dos 格式文件:

$ file dos_utf8_file.txt 
dos_utf8_file.txt: UTF-8 Unicode text, with CRLF line terminators

使用 file 命令查看 unix 格式文件:

$ file unix_utf8_file.txt
unix_utf8_file.txt: UTF-8 Unicode text

dos 和 unix 的相互转换

dos 格式文件转换成 Unix 格式文件, 就是把 CRLF 替换为 LF; unix 格式文件转换成 dos 格式文件, 就是把 LF 替换为 CRLF

dos2unix 和 unix2dos

dos2unix: dos 格式文件转换为 unix 格式文件
unix2dos: unix 格式文件转换为 dos 格式文件

这是类 UNIX 系统上的两个命令, 如果没有安装, 请先安装

使用 nodejs 转换 CRLF 和 LF

function dos2unix (content) {
  return content.split('\r\n').join('\n');
}

function unix2dos (content) {
  let len = content.length;
  let dos_content = '';
  let lastChar = '', curChar;

  for (let i=0; i<len; i++) {
    curChar = content.charAt(i);

    if (curChar === '\n' && lastChar !== '\r') {
      dos_content += '\r';
    }
    dos_content += curChar;

    lastChar = curChar;
  }

  return dos_content;
}

使用 git 转换 CRLF 和 LF

为了保持跨平台一致性, 最好保持行结束符一致, 因此推荐 Windows 设置 autocrlftrue, 类 UNIX 系统设置 autocrlfinput

  • Git 在提交代码时自动地把行结束符 CRLF 转换成 LF, 签出代码时候把行结束符转换为 CRLF:

      git config core.autocrlf true
    
  • Git 在提交时把 CRLF 转换成 LF,签出时不转换:

      git config core.autocrlf input
    
  • 不进行任何转换(默认):

      git config core.autocrlf false
    


blog comments powered by Disqus