답변:
그들은 다른 캐릭터입니다. \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 ++에서 의미는 플랫폼에 따라 다르기 때문에 물이 다소 더 흐릿합니다. 자세한 내용은 의견을 참조하십시오.
\n
이 보장됩니다 (섹션 2.4.4.4). 물론 OP가 플랫폼을 지정했다면 좋을 것입니다 ... 게다가,이 수준의 세부 사항은 차이를 묻는 누군가에게 유용하지 않을 것입니다.
C 및 C ++에서 \n
개념은 개념이며 \r
캐릭터 \r\n
이며 (거의 항상) 이식성 버그입니다.
오래된 텔레타이프를 생각해보십시오. 프린트 헤드는 일부 줄과 열에 있습니다. 인쇄 가능한 문자를 텔레타이프로 보내면 현재 위치에서 문자를 인쇄하고 머리를 다음 열로 이동합니다. (타자기는 일반적으로 인쇄 헤드와 관련하여 용지를 옮겼다는 점을 제외하고는 개념적으로 타자기와 동일합니다.)
현재 줄을 끝내고 다음 줄에서 시작하려면 두 가지 단계를 별도로 수행해야합니다.
ASCII는 이러한 작업을 두 개의 고유 한 제어 문자로 인코딩합니다.
\x0D
(CR)은 프린트 헤드를 줄의 처음으로 이동시킵니다. (유니 코드는 이것을로 인코딩합니다 U+000D CARRIAGE RETURN
.)\x0A
(LF)는 프린트 헤드를 다음 줄로 이동시킵니다. (유니 코드는 이것을로 인코딩합니다 U+000A LINE FEED
.)텔레타이프와 초기 기술 프린터 시대에 사람들은 실제로 두 가지 별도 작업이라는 사실을 이용했습니다. LF로 CR을 따르지 않고 CR을 보내면 이미 인쇄 한 줄을 통해 인쇄 할 수 있습니다. 이것은 악센트, 굵은 글씨 및 밑줄과 같은 효과를 허용했습니다. 하드 카피에서 암호가 보이지 않도록 일부 시스템이 여러 번 중복 인쇄되었습니다. 초기 직렬 CRT 터미널에서 CR은 이미 화면에있는 텍스트를 업데이트하기 위해 커서 위치를 제어하는 방법 중 하나입니다.
그러나 대부분의 경우 실제로 다음 줄로 가고 싶었습니다. 한 쌍의 제어 문자를 요구하지 않고 일부 시스템은 하나 또는 다른 것을 허용했습니다. 예를 들면 다음과 같습니다.
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 인 경우) \n
LF가 아닐 것입니다.
따라서 C 및 C ++에서 :
\r
말 그대로 캐리지 리턴입니다.\n
호스트 플랫폼의 개행 시맨틱 과 런타임 시 (텍스트 모드에서) 변환되는 마법의 값입니다 .\r\n
거의 항상 이식성 버그입니다. 텍스트 모드에서 이것은 CR로 변환되고 플랫폼의 개행 순서가 이어집니다. 아마 의도하지 않은 것입니다. 이진 모드에서 이것은 CR로 변환되고 LF 가 아닐 수도 있는 마법의 값으로 이어질 수 있습니다 .\x0A
ASCII LF를 나타내는 가장 이식 가능한 방법이지만 이진 모드에서만 수행하려고합니다. 대부분의 텍스트 모드 구현은 이와 같이 취급합니다 \n
.\r\n
실제로 줄을 별도의 목록 요소로 올바르게 나눌 수있는 유일한 방법입니다. 이것이 이상한 HTML 아티팩트인지 파이썬이 request
객체 에서 문자열을 수집하는 방식과 관련이 있는지 궁금 합니다.
'\n'
있습니다.