{{위키데이터 속성 추적}}
[[파일:Illustration of a newline.png|섬네일|"Hello"와 "world" 단어 사이에 추가된 새 줄]]
'''새줄 문자'''(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)를 쓰는 시스템도 있었다.

{| class="wikitable"
|+ ASCII의 새줄 문자
! 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도 지원하도록 권장하고 있다.

==== 변환 방법 ====
일회성 변환 작업은 [[텍스트 에디터]]를 사용할 수 있으나, 반복적인 작업은 [[명령 줄 인터페이스]]에서 수행하는 것이 편리하다.

===== [[도스]]/[[윈도]]에서 =====
<syntaxhighlight lang="doscon">
 >TYPE unix_file | FIND "" /V > dos_file
</syntaxhighlight>

===== [[유닉스]]에서 =====
* tr
<syntaxhighlight lang="bash">
 $ tr -d '\r' &lt; ''inputfile'' &gt; ''outputfile''   # DOS to UNIX
 $ tr '\r' '\n' &lt; ''inputfile'' &gt; ''outputfile'' # old Mac to UNIX
</syntaxhighlight>

* [[AWK]]
<syntaxhighlight lang="bash">
$ awk '{sub("$","\r\n"); printf("%s",$0);}' inputfile > outputfile  # UNIX to DOS
$ awk '{gsub("\r",""); print;}' inputfile > outputfile              # DOS to UNIX
</syntaxhighlight>

* [[Sed (유틸리티)|sed]]
<syntaxhighlight lang="bash">
$ sed -e 's/$/\r/' inputfile > outputfile              # UNIX to DOS
$ sed -e 's/\r$//' inputfile > outputfile              # DOS  to UNIX
</syntaxhighlight>

* [[펄|perl]]
<syntaxhighlight lang="bash">
$ 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
</syntaxhighlight>

=== 유니코드 ===
[[유니코드]] 표준은 여러 글자를 줄바꿈 문자로 정의했다. 유니코드를 지원하는 프로그램은 이것들을 한 줄의 끝으로 인식해야 한다.

{| class="wikitable"
|+ 유니코드의 새줄 문자
! 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]]도 레코드 기반 파일 시스템을 사용한다. 텍스트 파일을 저장할 때 레코드마다 한 줄씩 저장한다. 대부분 파일 형식이 줄 구분 문자를 사용하지 않지만 [[레코드 관리 서비스]]가 투명한 새줄 문자를 삽입할 수 있다.

== 같이 보기 ==
* [[자동 줄 바꿈]]

[[분류:제어 문자]]