CRLF

CRLF는 새줄 문자를 말한다. New Line, Line Break, Line Separators, EOL(End-Of-Line)라고도 한다.

CR(Carrige Return)

LF(Line Feed)

운영체제별 줄바꿈 문자

OS별로 줄바꿈 문자가 다르다.

역사
ISO와 ASA(ANSI의 전신)는 동시에 ASCII를 개발했다. 1963년부터 1968년까지 ISO 초안은 CR+LF와 LF를 새줄 문자로 정했다. ASA의 초안은 CR+LF만 지원했다. CR+LF는 텔레타이프, ASR33을 콘솔 장치로 사용한 초기 컴퓨터 시스템에서 널리 쓰였다.

텔레타이프의 프린터가 다음 줄의 처음부터 인쇄하기 위해서는 두 글자를 인쇄하는 시간이 필요했다. 텔레타이프는 텍스트의 한 글자를 같은 시간 간격으로만 프린터로 전송할 수 있었다. 프린터에서 좌우로 움직이는 장치가 캐리지(carriage)였는데 이것이 오른쪽 끝에서 왼쪽 끝으로 이동하는 시간이 두 글자 인쇄하는 만큼 걸렸다. 새줄 문자로 코드 하나만 쓸 경우 다른 한 글자를 인쇄할 수 없었다. 그래서 텔레타이프를 쓰던 시절에는 CR+LF 두 코드를 새줄 문자로 썼다. 캐리지 리턴이 먼저 전송되었다. 그리고 종이를 한 줄 옮기는 라인 피드가 이어서 전송되었다. 좌우 여백이 줄어들면 캐리지가 이동하는 시간이 더 필요하므로 CR이나 NUL을 더 채워 넣어야 할 때도 있었다.

컴퓨터가 막 탄생하던 시절에는 디스크와 메모리가 비쌌기 때문에 1964년에 나온 운영 체제 멀틱스는 새줄 문자를 LF 하나로 통일했다. 유닉스도 멀틱스의 새줄 문자 관례를 이어받았고 리눅스도 이 방식을 쓰고 있다.

1981년에 등장한 MS-DOS는 CP/M의 CR+LF 방식을 따랐다. CP/M은 시리얼 라인으로 터미널을 연결했기 때문에 화면 전환 속도가 느렸다. 느린 터미널에서 줄바꿈이 있을 때 스크롤 하는 시간과 보조를 맞추기 위해 CR+LF 방식을 쓰는 것이 자연스러웠다. 윈도도 이 관례를 따르고 있다. - 위키피디아

CRLF 충돌

한 시스템만을 사용한다면 문제없겠지만 타기종간에 파일을 주고받을때 문제가 발생한다.

가장 빈번한 케이스는 어떤 프로젝트를 공동으로 진행할때 어떤 개발자는 윈도우시스템을 사용하고 어떤 개발자는 맥이나 리눅스를 사용할때 같은 파일을 수정하면 줄바꿈문자의 충돌이 발생한다.

요즘 많은 IDE나 에디터들이 자동으로 시스템간 줄바꿈문자를 인삭하여 렌더링해주므로 그닥 신경쓰이지는 않지만 아무 작업도 안했는데 단지 줄바꿈으로 인해 코드가 변경되어 코드가 업데이트된다면 이력관리에 좋지 않을 것이다. 그러므로 CRLF든 LF든 하나로 통일하여 사용하는것이 좋다.1

LF포맷을 윈도우에서 보면 아래와 같이 제대로 줄바꿈이 표시되지 않는다.

LF와 CRLF가 섞인 파일을 vim에서 보면 ^M이 보인다.

CRLF 수정

CRLF를 LF로 수정하거나 LF를 CRLF로 수정하는 방법은 다양하다 그중 몇가지 알아봤다.

GIT

위에서도 언급했듯 CRLF의 충돌이 가장 많이 발생하는 케이스는 버전관리일것이다. GIT은 CRLF를 통일하여 사용할 수 있도록 옵션을 제공한다.

core.eof 이 옵션은 CRLF나 LF 둘중 하나를 강제할 수 있다.

core.autocrlf

.gitattributes
Git은 .gitattributes를 통해 특정 패턴의 파일들에 대해 crlf를 처리하도록 할 수 있다. .gitignore와 비슷하게 저장소에 공유하면 core옵션설정을 하지 않아도 저장소 공유멤버에게 동일하게 적용되는 장점이 있다.

단, 주의할점은 공식 Git 클라이언트외에 다른 Git 클라이언트에서 위 옵션들을 체크하지 않을 수 있으므로 해당 옵션을 사용할 것이라면 현재 사용중인 클라이언트에서 지원하지는 점검이 필요하다.

VIM & CLI

문자치환

vim에서 텍스트파일을 열어보면 라인끝에 ^M이 보일때가 있다. 시스템간 줄바꿈문자가 섞여서 발생하는 현상인데 문자치환으로 삭제할 수 있다. 아래는 다음과 같이 입력할 결과다. :1,$s/Ctrl+v+m//g

:1,$s/^M//g

파일포맷 변경

:set fileformat=unix 또는 :set ff=unix로 파일포맷을 변경하고 저장한다. 반대로 Windows의 줄바꿈문자(crlf)를 붙이려면 :set fileformat=dos

CLI로 변경

$ dos2unix < dosfile > unixfile
$ unix2dos < unixfile > dosfile
$ sed 's/'`echo "\015"`'//g' file > filenew  # ^M is ascii 15
$ tr -d "\015\032" < dosfile > unixfile # 015 is CR, 032 is Ctrl-Z
$ cat dos-file | tr -d ^M > unixfile
$ perl -i -pe 's/\015//g' *.html

JetBrains IDEs

메뉴바 또는 화면하단 상태바에 EOL을 설정할 수 있는 메뉴가 있다. CRLF를 DOS 또는 Windows모드, LF를 UNIX 모드로 표시한다.

Referecnes


  1. 오픈소스진영에서는 많은 프로젝트에서 LF를 사용하는 경우가 많다. [return]
comments powered by Disqus