LF, CR 그리고 CRLF

개행 문자는 멀티 플랫폼에서 작업하는 사람들을 귀찮게 하는 것 중 하나다. Mac OS, Windows, Linux는 모두 다른 문자를 개행 문자로 사용한다. 심지어 Mac OS는 과거 버전과 최신 버전에서의 동작이 또 다르다. 이번 글에서는 시스템별로 다른 개행 문자를 사용하는 원인을 살펴볼 것이다.

ISO 6429 표준에 따르면 LF(line feed, \n)는 커서를 현재 행을 유지하면서 다음 줄로 옮기고, CR(carriage return, \r)는 커서를 현재 라인의 처음으로 옮긴다. 우리가 원하는 개행 문자의 동작을 위해서는 CRLF를 함께 써야 한다. 이런 구분은 라인을 바꾸는 동작과, 커서를 처음으로 옮기는 동작이 구분된 초기 프린터나 타자기의 동작을 모방했기 때문이다.

A
 B

즉, 표준에 따르면 "A\nB"라는 문자열은 위에 보인 예시대로 A 아래 바로 B가 오는 것이 아니라, A의 대각선 아래 B가 와야 한다. 하지만 개행 문자로 CRLF를 사용하는 시스템은 드물다. 지금은 스토리지가 매우 싼 자원이다. 하지만 과거에는 스토리지가 매우 비싼 자원이었다. 이 시절 시스템 설계자들은 개행 문자를 위해 2바이트나 할당하라는 것을 과도한 사치로 보았다. 결국 어떤 시스템 설계자는 LF를 어떤 시스템 설계자는 CR을 단독으로 개행 문자로 사용하기 시작했다.

그 와중에도 표준을 지키던 시스템이 있었다. 그중 하나는 CP/M이라는 운영체계다. CP/M은 CRLF의 조합을 개행문자로 사용했다. 이는 단순히 표준을 지키고자 하는 의지 때문이 아니라, 과거 있었던 원격 터미널 장치와의 호환성을 유지하기 위한 전략적 선택이었다. 다른 말로 하면, 비싼 스토리지 비용을 감당하더라도 호환성을 유지해 시장을 장악하는 것이 유리하다는 판단이었다. 후에 나오는 몇몇 운영체제도 CP/M과 같은 선택을 했고, 이 중 하나가 마이크로소프트의 MS-DOS였다. 이 선택이 지금까지 이어져 마이크로소프트의 Windows는 CRLF를 개행 문자로 사용하고 있다.

개행 문자를 한 바이트로 줄이기로 한 운영 체제들 사이에서도 선택이 갈렸다. 어떤 설계자는 LF를 개행문자로 선택했고, 다른 사람들은 CR을 개행문자로 선택했다. LF를 선택한 진영에 멀틱스라는 운영 체제가 있었다. 지금은 사용되지 않지만, 멀틱스는 후에 Unix나 BSD 같은 운영 체제의 디자인에 영향을 미쳤고, Unix에 영향을 받은 Linux도 LF를 만나면 커서를 다음 줄의 시작으로 옮긴다.

CR을 개행문자로 선택한 대표적인 진영에는 애플이 있다. 1977년 만들어진 Apple II는 CR을 개행 문자로 사용하고, LF를 만나면 단순히 무시하는 전략을 선택했다. 이 선택은 Mac OS에도 이어졌다. 하지만 1988년 POSIX.1(Portable Operating System Interface) 표준이 만들어지고, Linux를 포함한 Unix 계열 운영체제들은 서로 간의 호환성을 중시하기 시작하면서, 애플도 변하기 시작했다. 결국 2001년 OS X에서 LF를 개행 문자로 사용하기로 하면서 CR을 개행 문자로 사용하는 시스템은 보기 어려워졌다. 현재 대부분의 시스템에서는 애플의 일부 레거시 프로그램을 제외하면 LFCRLF 만이 존재한다.

댓글

이 블로그의 인기 게시물

[C++] enum class - 안전하고 쓰기 쉬운 enum

RAII는 무엇인가

Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash

[Python] cache 데코레이터로 최적화하기

[Web] SpeechSynthesis - TTS API