\ r과 \ n의 차이점은 무엇입니까?


245

어떻게 있습니다 \r\n다른? 유닉스 대 Windows 대 Mac과 관련이 있다고 생각하지만 정확히 어떻게 다른지, 그리고 정규식에서 검색 / 일치하는 것이 확실하지 않습니다.


1
언어 태그가 필요합니다. 언어마다 다른 해석이 '\n'있습니다.
Adrian McCarthy

답변:


383

그들은 다른 캐릭터입니다. \r캐리지 리턴 \n이며 줄 바꿈입니다.

"이전"프린터에서는 \r프린트 헤드를 줄의 시작 부분으로 다시 보내고 \n한 줄씩 용지를 전진시킵니다. 따라서 다음 줄에서 인쇄를 시작하려면 두 가지가 모두 필요했습니다.

콘솔에 따라 \r줄의 시작 부분으로 이동하여 기존 텍스트를 덮어 쓸 수는 있지만 지금은 다소 관련이 없습니다 .

더 중요한 것은 Unix \n가 줄 구분 기호 로 사용되는 경향이 있다는 것입니다 . Windows에서 사용되는 경향이 \r\n광고 세퍼레이터 (OS 9까지) 같은 맥 사용 사용할 \r개행있다. (Mac OS X은 Unix-y이므로 \n대신 사용 합니다. 대신 사용 되는 호환성 상황이있을 수 있습니다 \r.)

자세한 내용은 Wikipedia newline article을 참조하십시오 .

편집 : 이것은 언어에 민감합니다. 예를 들어 C # 및 Java에서 \n 항상 줄 바꿈으로 정의 된 유니 코드 U + 000A를 의미합니다. C 및 C ++에서 의미는 플랫폼에 따라 다르기 때문에 물이 다소 더 흐릿합니다. 자세한 내용은 의견을 참조하십시오.


22
노인은 +1 영광스러운 전자 터미널을 직접 제어하는 ​​데 사용되는 터미널 출력 (그 멋진 CRT 디스플레이 전에 TTY). 따라서 캐리지 리턴 및 줄 바꿈 문자 (Jon Skeet이 언급했듯이 둘 다 필요할 수 있음) 및 \ a "bell", \ b "backspace"( "delete"와 혼동하지 않아야 함) ") 및 기타 모든 제어 문자는 tty와 통신하는 데 필요합니다.
erjiang

35
노인을위한 또 다른 +1. 여전히 Windows 명령 프롬프트에서 Ctrl + G를 누르고 Enter를 누르면 PC 스피커에서 경고음이 울립니다. 그것은 고대부터 남아 있습니다.
Dave Carlile

@Crappy Coding Guy 정말? Vista에서는 " ''가 내부 또는 외부 명령으로 인식되지 않습니다"라고 표시되어 있습니다.
Ponkadoodle

2
@AdrianMcCarthy : 물론 여기서 질문은 실제로 C 또는 C ++를 지정 하지 않습니다 . 예를 들어 C #에서 줄 바꿈 \n 보장됩니다 (섹션 2.4.4.4). 물론 OP가 플랫폼을 지정했다면 좋을 것입니다 ... 게다가,이 수준의 세부 사항은 차이를 묻는 누군가에게 유용하지 않을 것입니다.
Jon Skeet

2
@AdrianMcCarthy :하지만 적어도 C # 및 Java, 그것은 이다 라인 피드. U + 000A이며 유니 코드에 의해 "LINE FEED"(및 NEW LINE)로 명명됩니다. 나는 C와 C ++의 특별한 경우를 언급하고 편집 할 수 있습니다,하지만 난 정말 그 믿고 있는 특별한 경우가 아닌 다른 방법 내내.
Jon Skeet

91

C 및 C ++에서 \n개념은 개념이며 \r캐릭터 \r\n이며 (거의 항상) 이식성 버그입니다.

오래된 텔레타이프를 생각해보십시오. 프린트 헤드는 일부 줄과 열에 있습니다. 인쇄 가능한 문자를 텔레타이프로 보내면 현재 위치에서 문자를 인쇄하고 머리를 다음 열로 이동합니다. (타자기는 일반적으로 인쇄 헤드와 관련하여 용지를 옮겼다는 점을 제외하고는 개념적으로 타자기와 동일합니다.)

현재 줄을 끝내고 다음 줄에서 시작하려면 두 가지 단계를 별도로 수행해야합니다.

  1. 프린트 헤드를 줄의 처음으로 이동 한 다음
  2. 다음 줄로 이동하십시오.

ASCII는 이러한 작업을 두 개의 고유 한 제어 문자로 인코딩합니다.

  • \x0D(CR)은 프린트 헤드를 줄의 처음으로 이동시킵니다. (유니 코드는 이것을로 인코딩합니다 U+000D CARRIAGE RETURN.)
  • \x0A(LF)는 프린트 헤드를 다음 줄로 이동시킵니다. (유니 코드는 이것을로 인코딩합니다 U+000A LINE FEED.)

텔레타이프와 초기 기술 프린터 시대에 사람들은 실제로 두 가지 별도 작업이라는 사실을 이용했습니다. LF로 CR을 따르지 않고 CR을 보내면 이미 인쇄 한 줄을 통해 인쇄 할 수 있습니다. 이것은 악센트, 굵은 글씨 및 밑줄과 같은 효과를 허용했습니다. 하드 카피에서 암호가 보이지 않도록 일부 시스템이 여러 번 중복 인쇄되었습니다. 초기 직렬 CRT 터미널에서 CR은 이미 화면에있는 텍스트를 업데이트하기 위해 커서 위치를 제어하는 ​​방법 중 하나입니다.

그러나 대부분의 경우 실제로 다음 줄로 가고 싶었습니다. 한 쌍의 제어 문자를 요구하지 않고 일부 시스템은 하나 또는 다른 것을 허용했습니다. 예를 들면 다음과 같습니다.

  • 최신 버전의 Mac을 포함한 Unix 변형은 LF 문자 만 사용하여 줄 바꿈을 나타냅니다.
  • 오래된 (OSX 이전) Macintosh 파일은 CR 문자 만 사용하여 줄 바꿈을 나타 냈습니다.
  • VMS, CP / M, DOS, Windows 및 많은 네트워크 프로토콜은 여전히 CR LF를 모두 기대합니다.
  • EBCDIC 를 사용하는 이전 IBM 시스템 은 ASCII 문자 세트에는없는 문자 인 NL로 표준화되었습니다. 유니 코드에서 NL은 U+0085 NEXT LINE이지만 실제 EBCDIC 값은 0x15입니다.

다른 시스템이 다른 방법을 선택한 이유는 무엇입니까? 보편적 인 표준이 없었기 때문입니다. 키보드에 "Enter"라고 표시되면 구형 키보드는 캐리지 리턴 (Carriage Return)의 줄임말 인 "Return"이라고했습니다. 실제로 직렬 터미널에서 Return 키를 누르면 실제로 CR 문자가 전송됩니다. 텍스트 편집기를 작성하는 경우 터미널에서 온 문자 만 사용하는 것이 좋습니다. 아마도 이것이 구형 맥이 CR 만 사용했던 이유 일 것입니다.

지금 우리가 가지고 기준을 , 거기에 줄 바꿈을 표현하는 방법. 야생에서는 극히 드물지만 유니 코드에는 다음과 같은 새로운 문자가 있습니다.

  • U+2028 LINE SEPARATOR
  • U+2029 PARAGRAPH SEPARATOR

유니 코드가 등장하기 전에도 프로그래머는 기본 문자 집합에 대한 걱정없이 가장 유용한 제어 코드를 표현할 수있는 간단한 방법을 원했습니다. C에는 제어 코드를 나타내는 몇 가지 이스케이프 시퀀스가 ​​있습니다.

  • \a 텔레타이프 벨을 울리거나 단말기에서 신호음을 울리는 (경고 용)
  • \f 다음 페이지의 시작으로 이동하는 (양식 피드 용)
  • \t 프린트 헤드를 다음 수평 탭 위치로 이동시키는 (탭용)

(이 목록은 의도적으로 불완전합니다.)

이 매핑은 컴파일 타임에 발생합니다. 컴파일러는 \a벨을 울리는 데 사용되는 매직 값을 보고 넣습니다.

이러한 니모닉 대부분은 ASCII 제어 코드와 직접적인 상관 관계가 있습니다. 예를 들어에 \a매핑됩니다 0x07 BEL. 호스트 문자 세트 (예 : EBCDIC)에 ASCII 이외의 것을 사용하는 시스템 용으로 컴파일러를 작성할 수 있습니다. 특정 니모닉이있는 대부분의 제어 코드는 다른 문자 집합의 제어 코드에 매핑 될 수 있습니다.

후자! 휴대 성!

거의. C에서는 printf("\aHello, World!");종을 울리는 (또는 경고음) 메시지를 출력 할 수 있습니다. 그러나 다음 줄에 무언가를 인쇄하려면 여전히 호스트 플랫폼이 다음 출력 줄로 이동하는 데 필요한 것을 알아야합니다. CR LF? CR? LF? NL? 다른 것? 휴대 성이 뛰어납니다.

C에는 I / O에 대한 이진 모드와 텍스트 모드가 있습니다. 이진 모드에서는 전송 된 모든 데이터가 그대로 전송됩니다. 그러나 텍스트 모드 에는 특수 문자를 호스트 플랫폼이 새 줄에 필요한 것으로 변환하는 런타임 변환이 있습니다 (그 반대도 가능).

좋아, 그래서 특별한 성격은 무엇입니까?

글쎄, 그것은 구현에 의존하지만 그것을 지정하는 구현 독립적 인 방법이 있습니다 : \n. 일반적으로 "줄 바꿈 문자"라고합니다.

이것은 미묘하지만 중요한 포인트입니다 : \n 에 매핑되는 컴파일시구현 정의 다음에 다시 매핑됩니다 (텍스트 모드에서) 문자 값 실행 시간 이동에 기본이되는 플랫폼에서 필요로하는 실제 문자 (또는 문자의 순서)에 다음 줄로.

\n두 개의 매핑이 관련되어 있기 때문에 다른 모든 백 슬래시 리터럴과 다릅니다. 이 2 단계 매핑은 \n짝수 \r와 크게 다릅니다 . 이는 단순히 컴파일 타임에 CR (또는 기본 문자 집합이 무엇이든 가장 유사한 제어 코드)에 매핑됩니다.

이것은 많은 C 및 C ++ 프로그래머를 트립합니다. 100 개를 폴링해야한다면 최소한 99가 \n줄 바꿈 을 의미 한다고 알려줄 것입니다 . 이것은 전적으로 사실이 아닙니다. 대부분의 C 및 C ++ 구현은 LF를 마법의 중간 값으로 사용 \n하지만 이는 구현 세부 사항입니다. 컴파일러가 다른 값을 사용하는 것이 가능합니다. 실제로 호스트 문자 세트가 ASCII의 상위 세트가 아닌 경우 (예 : EBCDIC 인 경우) \nLF가 아닐 것입니다.

따라서 C 및 C ++에서 :

  • \r 말 그대로 캐리지 리턴입니다.
  • \n호스트 플랫폼의 개행 시맨틱 과 런타임 시 (텍스트 모드에서) 변환되는 마법의 값입니다 .
  • \r\n거의 항상 이식성 버그입니다. 텍스트 모드에서 이것은 CR로 변환되고 플랫폼의 개행 순서가 이어집니다. 아마 의도하지 않은 것입니다. 이진 모드에서 이것은 CR로 변환되고 LF 가 아닐 수도 있는 마법의 값으로 이어질 수 있습니다 .
  • \x0AASCII LF를 나타내는 가장 이식 가능한 방법이지만 이진 모드에서만 수행하려고합니다. 대부분의 텍스트 모드 구현은 이와 같이 취급합니다 \n.

파이썬에서 <textarea> 입력을 나누는 방법을 알아 내려고 하면서이 게시물을 보았으며 \r\n실제로 줄을 별도의 목록 요소로 올바르게 나눌 수있는 유일한 방법입니다. 이것이 이상한 HTML 아티팩트인지 파이썬이 request객체 에서 문자열을 수집하는 방식과 관련이 있는지 궁금 합니다.
Pat Jones

11
  • "\ r"=> 리턴
  • "\ n"=> 줄 바꿈 또는 줄 바꿈 (의미)

  • 유닉스 기반 시스템은 "\ n"만 사용하여 한 줄의 텍스트를 끝냅니다.

  • Dos는 "\ r \ n"을 사용하여 한 줄의 텍스트를 끝냅니다.
  • 다른 컴퓨터는 "\ r"만 사용했습니다. (Commodore, Apple II, OS X 이전의 Mac OS 등)

5

\r 줄의 시작을 가리키고 거기에서 텍스트를 바꿀 수 있습니다.

main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}

이 출력을 생성합니다.

hai

\n 새로운 줄입니다.


4

즉, \ r은 ASCII 값 13 (CR)을 가지며 \ n은 ASCII 값 10 (LF)을 갖습니다. Mac은 CR을 줄 구분 기호로 사용합니다. (최소한, 이전에는 확실하지 않았습니다.)


1
Mac OS X 시스템은 기본적으로 LF를 사용합니다 (BSD Unix를 기반으로하기 때문에).
dreamlax

3

@ Jon Skeet의 답변 외에도 :

전통적으로 Windows는 \ r \ n, Unix \ n 및 Mac \ r을 사용했지만 최신 Mac은 \ n을 유닉스 기반으로 사용합니다.


2

C #에서 문자열에 \ r \ n을 사용한다는 것을 알았습니다.


2

\ r 캐리지 리턴입니다. \ n은 새 줄입니다 (줄 바꿈) ... OS에 따라 각각의 의미가 다릅니다. C의 '\ n'과 '\ r \ n'...의 차이점에 대한 자세한 내용 은 이 기사 를 읽으십시오 .


1

\ r 캐리지 리턴에 사용됩니다. (ASCII 값은 13입니다) \ n 줄 바꾸기에 사용됩니다. (ASCII 값은 10입니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.