새줄 문자
새줄 문자(newline)는 텍스트의 한 줄이 끝남을 표시하는 문자 또는 문자열이다. 개행 문자, 줄바꿈 문자(line break), EOL(end-of-line)과 같은 뜻이다. 기종이나 운영 체제에 따라 새줄 문자를 나타내는 코드가 다를 수도 있다. 그래서 텍스트를 다른 시스템으로 전송할 때 새줄 문자의 치환 작업도 필요하다.
새줄 문자가 마지막 줄 끝에도 들어가는지 여부가 헷갈릴 수 있다. 대부분의 시스템이 관습적으로 마지막 줄 끝에도 새줄 문자를 넣는다. 프로그램 중에는 마지막 줄 끝에 새줄 문자가 없으면 오류가 발생하는 것도 있다.
자동 줄 바꿈 기능이 있는 소프트웨어는 주로 문단 사이 또는 수직 목록 사이에서 새줄 문자를 사용한다. 새줄 문자를 사용하는 방식으로 하드 리턴과 소프트 리턴이 있다.
역사
편집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 방식을 쓰는 것이 자연스러웠다. 윈도우도 이 관례를 따르고 있다.
표현
편집줄바꿈을 표현하는 방법은 시스템과 운영 체제에 따라 여러 가지가 있다. 윈도우는 ASCII의 CR+LF로 새줄을 나타내고 유닉스는 LF로 새줄을 나타낸다. 맥 OS은 새줄 문자로 버전 9까지 CR을 썼지만 버전 10부터 LF를 쓰고 있다. 새줄 문자로 이밖의 다른 코드를 사용하는 시스템도 있다. 특정 코드를 사용하지 않고 레코드 하나에 한 줄씩 저장하거나 줄의 길이를 고정시켜서 줄바꿈을 표현하는 시스템도 있다.
ASCII
편집ASCII 시스템에서는 새줄 문자로 라인 피드(line feed, LF, '\n', 0x0A), 캐리지 리턴(carriage return, CR, '\r', 0x0D)이 주로 사용된다. 라인 피드는 프린터에서 종이가 한 줄씩 인쇄되며 나오는 것을 뜻한다. 캐리지 리턴은 프린터에서 실제 인쇄를 수행하는 장치가 한 줄의 끝에서 시작 위치로 돌아가는 것을 뜻한다. 새줄 문자로 드물게 RS(record separator, 0x1E)를 쓰는 시스템도 있었다.
LF | 멀틱스, 유닉스, 리눅스, 제닉스, AIX, OS X, FreeBSD |
---|---|
CR+LF | DEC TOPS-10, RT-11, CP/M, MP/M, 도스, OS/2, 윈도우, 심비안 OS, 팜 OS |
CR | 코모도어 8비트 머신, TRS-80, 애플 II, 맥 OS (버전 9 이하), OS-9 |
RS | POSIX 이전의 QNX |
HTTP, SMTP, FTP, IRC 등 인터넷 프로토콜 대부분은 ASCII의 CR+LF를 새줄 문자로 사용하도록 규정하고 있다. 그러나 홀로 쓰인 LF도 지원하도록 권장하고 있다.
변환 방법
편집일회성 변환 작업은 텍스트 에디터를 사용할 수 있으나, 반복적인 작업은 명령 줄 인터페이스에서 수행하는 것이 편리하다.
>TYPE unix_file | FIND "" /V > dos_file
- tr
$ tr -d '\r' < ''inputfile'' > ''outputfile'' # DOS to UNIX
$ tr '\r' '\n' < ''inputfile'' > ''outputfile'' # old Mac to UNIX
$ awk '{sub("$","\r\n"); printf("%s",$0);}' inputfile > outputfile # UNIX to DOS
$ awk '{gsub("\r",""); print;}' inputfile > outputfile # DOS to UNIX
$ sed -e 's/$/\r/' inputfile > outputfile # UNIX to DOS
$ sed -e 's/\r$//' inputfile > outputfile # DOS to UNIX
$ perl -pe 's/\r?\n|\r/\r\n/g' inputfile > outputfile # Convert to DOS
$ perl -pe 's/\r?\n|\r/\n/g' inputfile > outputfile # Convert to UNIX
$ perl -pe 's/\r?\n|\r/\r/g' inputfile > outputfile # Convert to old Mac
유니코드
편집유니코드 표준은 여러 글자를 줄바꿈 문자로 정의했다. 유니코드를 지원하는 프로그램은 이것들을 한 줄의 끝으로 인식해야 한다.
LF | 라인 피드(Line Feed), U+000A |
---|---|
FF | 폼 피드(Form Feed), U+000C |
CR | 캐리지 리턴(Carriage Return), U+000D |
CR+LF | 연속된 CR과 LF |
NEL | 다음 줄(Next Line), U+0085 |
LS | 줄 구분자(Line Separator), U+2028 |
PS | 문단 구분자(Paragraph Separator), U+2029 |
EBCDIC
편집IBM 메인프레임, z/OS(OS/390), i5/OS(OS/400) 등 EBCDIC 시스템은 새줄 문자로 NEL(next line, 0x15)을 사용한다. EBCDIC에도 CR, LF로 불리는 글자가 있지만 ASCII의 것과 코드가 다르다. EBCDIC 시스템 중에는 NEL 코드가 다른 것도 있어서 주의해야 한다.
기타 코드
편집CDC 6000 시리즈의 운영 체제는 60비트짜리 단어 끝 부분에 6비트짜리 글자 2개 이상이 0으로 채워진 상태를 새줄 문자로 정의했다. 채우는 문자로 0 대신 콜론이 되도록 설정을 바꿀 수 있었다. 싱클레어 리서치의 가정용 컴퓨터, ZX80, ZX81은 새줄 문자 코드가 0x76이었다.
레코드 방식
편집옛날의 메인프레임 운영 체제는 텍스트 한 줄마다 레코드에 저장하는 방식이었다. 레코드의 시작 부분에 캐리지 제어 문자를 둬서 줄바꿈 여부, 캐리지 리턴 여부를 조절할 수 있게 했다.
몇몇 메인프레임 운영 체제는 고정된 줄 길이로 한 줄을 저장했다. 그 길이는 주로 80자였다. 외부에서 텍스트 파일을 받았을 때 한 줄이 80자보다 짧으면 공백 문자로 채워야 했고 한 줄이 너무 길면 잘려나갔다. 이것은 천공 카드의 방식을 흉내낸 것이다. 천공 카드 한 장마다 한 줄씩 기록했고 이 길이가 80자였다.
OpenVMS도 레코드 기반 파일 시스템을 사용한다. 텍스트 파일을 저장할 때 레코드마다 한 줄씩 저장한다. 대부분 파일 형식이 줄 구분 문자를 사용하지 않지만 레코드 관리 서비스가 투명한 새줄 문자를 삽입할 수 있다.