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


609

\n(줄 바꿈)과 \r(캐리지 리턴) 의 차이점은 무엇입니까 ?

특히 와 사이에 실질적인 차이가 있습니까? 다른 하나 대신 사용해야하는 곳이 있습니까?\n\r


3
모든 대답은 상당히 예측 가능하지만 \ n과 \ r 사이에 실질적인 차이가 있는지 알고 싶습니다. 한 곳을 다른 곳보다 사용해야하는 곳이 있습니까?
임팔라 블라드

9
예, LF (줄 바꿈) 만있는 텍스트 파일은 일부 Windows 응용 프로그램에서 종료 된 것으로 보이지 않으며 일부 Linus 응용 프로그램에서 CRLF로 종료 된 텍스트 파일은 추가 문자를 갖는 것으로 보입니다.
pavium

2
예, \ r은 일부 Linux 콘솔 앱에서 회 전선 애니메이션을 수행하는 데 사용됩니다.
Murali

8
\ r가 여전히 일반 Mac EOL입니까? "Classic"Mac 용이라고 확신하지만 OS X가 Unixified 인 것으로 생각했습니다. (내가 Mac에 얼마나 익숙한 지 보여줍니다.)
John Y

11
역사적으로 \ n은 캐리지를 아래로 이동하는 데 사용되었지만 \ r은 캐리지를 페이지의 왼쪽으로 다시 이동하는 데 사용되었습니다.
karthik gorijavolu

답변:


827

ASCII 코드의 관점에서 보면 각각 10과 13이므로 3입니다 .-).

그러나 진지하게 많은 것이 있습니다.

  • 유닉스와 모든 유닉스 계열 시스템에서 \n줄 끝의 코드이며 \r특별한 의미는 없습니다.
  • 결과적으로 C 및 대부분의 언어에서 (원격으로) 복사하는 대부분의 언어 \n에서 줄 끝의 표준 이스케이프 시퀀스입니다 (필요에 따라 OS 특정 시퀀스로 /에서 변환 됨)
  • 구형 Mac 시스템 (OS X 이전 버전)에서 \r줄 끝 코드
  • Windows (및 이전의 많은 OS)에서 줄 끝 코드는 2 자 ( \r\n순서대로)입니다.
  • (놀라운 ;-) 결과로서 (Windows보다 훨씬 오래된 OS로 되돌아가는) \r\n인터넷의 텍스트 형식에 대한 표준 줄 종결
  • 전기 기계식 텔레타이프 같은 "터미널"의 \r경우 캐리지가 가장 왼쪽에 닿을 때까지 왼쪽으로 되돌아 가도록 명령하고 (느린 작동) \n롤러가 한 줄을 롤업하도록 명령합니다 (훨씬 더 빠른 작동). \r 전에 \n , 캐리지가 여전히 왼쪽으로가는 동안 롤러 이동할 수 있음 -!) 위키 백과는이 자세한 설명을 .
  • 원시 모드에서 문자 모드 터미널 (일반적으로 위와 같이 더 오래된 인쇄를 에뮬레이트 함)의 경우 \r\n유사하게 작동합니다 ( 캐리지 또는 롤러 없으므로 커서 측면에서 둘 다 제외).

실제로 텍스트 파일에 쓰는 현대적인 상황에서는 항상 사용해야합니다 \n(기본 런타임은 Windows와 같은 이상한 OS 인 경우이를 번역합니다). 사용하는 유일한 이유 \r는 문자 터미널 (또는이를 모방 한 "콘솔 창")에 쓰고 있고 마지막으로 쓴 마지막 줄을 덮어 쓰기 위해 다음 줄을 쓰고 싶을 때입니다 (때로는 구피에 사용되는 "아스키 애니메이션" "진행률 표시 줄의 효과)-GUI의 세계에서는 꽤 쓸모 없어지고 있습니다 ;-).


12
이 답변에 역사에 추가하려면 : 라인 속도는 초당 10 자 증가로, 그것은 반환 운송 및 추가 무해한 문자 (일반적으로 NUL 즉 시간의 2 개 이상 문자의 가치를했다 \0)을 이후에 추가 된 \n추가 할 수 있도록 시각. 이것은 OS에 의해 투명하게 처리되었으므로 레거시 코드에서 흔적을 찾을 수 없습니다.
Mark Ransom

11
Windows는 어떻게 '이상한'운영 체제입니까?
mailmindlin

31
@mailmindlin- "창은 어떻게 '이상한'운영 체제입니까?" 답변 : 내가 쉽게 계산할 수있는 것보다 더 많은 방법으로 (양말을 착용하는 동안 발가락은 허용되지 않습니다 :-). 살아남은 다른 모든 OS는 유닉스 기반입니다. Windows는 여러 가지 방법으로 사라집니다. 이 특정 Q의 맥락에서-정식 라인 엔드로 두 바이트 (\ n \ r)를 포지셔닝하는 유일한 것입니다 ... 고대 역사적 이유는 스레드의 다른 곳에서 설명했습니다 ... 다른 모든 OS 단일 문자 a5 줄 끝이 있습니다 (99 % + 그들 중`\ n ').
Alex Martelli

1
@nothingiscessary : 예를 들어, 전자 메일 메시지의 형식을 정의하는 RFC 2822를 대체 한 tools.ietf.org/html/rfc5322
Keith Thompson

3
삶의 어떤 시점에서 어떤 종류의 파서를 작성하는 모든 사람들에게 작은 조언-줄 끝을 올바르게 처리하는 것을 잊지 마십시오. 나는 \r(리눅스를 사용 하고 있음)을 잊어 버렸기 때문에 꽤 불쾌한 경험을했습니다 . 유효한 파일로 보이는 것을 파싱하기 시작하면 파싱하는 파일이 Windows에서 만들어져 파서가 실패했습니다. : D도 있다는 것입니다 모두 큰 문제 \n또는 \r의미에서 볼 수 있습니다 그 예를 들어 a, ., (등의 문자가 있습니다.
rbaleksandar

122

역사적으로 a \n는 캐리지를 아래 \r로 이동하는 데 사용 되었지만 a 는 캐리지를 페이지의 왼쪽으로 다시 이동하는 데 사용되었습니다.


8
아마도 컴퓨터 질문에 대한 실질적인 대답은 아니지만 어쨌든 역사적 소문은 나에게 찬성을 얻습니다.
John Y

1
실제 타이핑 머신의 타이핑 부분을 왼쪽으로 옮길 때와 비슷하다고 상상해보십시오. 반환.
Jo Smo

2
\ n 캐리지를 아래로 이동하지 않고 롤러를 돌려 용지를 위로 이동시킵니다.
Roddy

5
모든 운동은 상대적입니다. 종이는 내 세상이고, 그와 관련하여 캐리지가 아래로 이동합니다 : P
tster

2
FWIW, \ r은 여전히 ​​현대 시스템에서 "캐리지 리턴"이 될 수 있습니다. printf("abcdefghijlm\rNOP\n");OpenSuSe에서 gcc-8로 컴파일 된 이 C 코드를 고려 하고 터미널에서 실행하면이 결과가 출력 NOPdefghijlm됩니다. 문자열의 \ r (캐리지 리턴)은 커서가 행의 시작 (캐리지)으로 이동하고 \ r (예 : "NOP") 뒤의 문자가 이전에 있던 것을 덮어 씁니다 (예 : "abc")! 같이 당신은 백 스페이스 (\ b)는 유사한 "캐리지 운동"을 달성 할 수있는 printf("abcdefghijlm\b\bNOP\n");생산하는abcdefghijNOP
GMC

36

두 개의 다른 캐릭터.

\n 유닉스 텍스트 파일에서 줄 끝 종결 자로 사용됩니다.

\r Mac 텍스트 파일에서 줄 끝 종결 자로 사용됩니다.

\r\n (즉 둘 다) Windows 및 DOS 텍스트 파일에서 행을 종료하는 데 사용됩니다.


2
Acorn 및 RISC OS와 같이 ENTER 키를 눌렀을 때 줄 끝 마커로 \ n \ r을 사용한 컴퓨터가 있습니다.
Anders

9
명확히하기 위해 : \r오랫동안 Mac에서 줄을 끝내지 않았습니다. 2001 년 Mac OS X (Unix 기반)가 출시되면서 \n이제 사용됩니다.
jbbuckley 1

3
그러나 \rMS Office 2011 Excel : CSV 저장 (모든 기본 설정 포함)을 사용하는 일부 응용 프로그램 은 ISO-8859-1로 인코딩 된 파일을 줄 \r끝으로 저장합니다 .
CodeBrauer

24

아무도 그것을 구체적으로 언급하지 않았기 때문에 (알거나 기억하기에는 너무 어리십니까?)-나는 \r\n타자기 및 유사한 장치에 대한 출처 의 사용을 의심합니다 .

여러 줄을 지원하는 타자기를 사용하면서 줄 바꿈을 원할 경우 수행해야 할 두 가지 물리적 작업이있었습니다. 캐리지를 페이지의 시작 부분 (미국의 경우 왼쪽)으로 다시 밀고 용지를 한 단계 위로 급지하십시오. .

예를 들어, 라인 프린터 시절에 굵은 텍스트를 수행하는 유일한 방법은 줄 바꿈없이 캐리지 리턴을 수행하고 이전 문자에 동일한 문자를 인쇄하여 더 많은 잉크를 추가하여 더 어둡게 (굵게 표시)하는 것입니다. . 타자기에서 기계적인 "개행"기능이 실패했을 때, 이는 성가신 결과였습니다.주의를 기울이지 않으면 이전 텍스트 줄 위에 입력 할 수 있습니다.


3
개행의 ASCII 표준은 \ r \ n입니다. (벨 전화가 표준위원회를 통제 할 때 짧은 간격을 제외하고). 전화 독점에 대한 대가로 Bell Telephone은 메시징 사업 (텔레 그램, 텔레타이프)을 포기했으며 기존 표준의 사용에 대해서는 신경 쓰지 않았습니다. HTTP, HTML, PCDOS 및 MSDOS는 ASCII 표준을 사용했습니다. Bell Telephone은 기존 비즈니스와 호환되지 않기 때문에 유닉스에 대해 비표준으로 선택했습니다.
david

12

운영 체제마다 다른 두 가지 문자 또한 이것은 전송 TCP/IP해야하는 데이터에서 중요한 역할 을합니다\r\n .

\n 유닉스

\r

\r\n Windows와 DOS.


10
나는 당신이 응용 프로토콜과 혼동하고 있다고 생각합니다 .TCP / IP는 \ n과 \ r을 전혀 모릅니다.
Jean-loup

4
TCP / IP에는 \ r \ n을 사용할 필요가 없습니다. SMTP, POP3, FTP, HTTP, ... 등 Telnet 기반의 다양한 프로토콜이 필요합니다.
Marquis of Lorne

9

완료하려면

쉘 (bash) 스크립트에서, \r커서를 온라인에서 물론 온라인으로 보낼 수 있습니다.\n 커서를 새로운 행에 넣을 수 있습니다.

예를 들어 다음을 시도하십시오.

echo -en "AA--AA" ; echo -en "BB" ; echo -en "\rBB"
  • 최초의 "에코"디스플레이 AA--AA
  • 두번째 : AA--AABB
  • 마지막 : BB--AABB

그러나 -en매개 변수 로 사용하는 것을 잊지 마십시오 .


5

Windows에서 \ n은 다음 줄의 시작 부분으로 이동합니다. \ r은 다음 줄로 이동하지 않고 현재 줄의 시작으로 이동합니다. 내 콘솔 응용 프로그램에서 \ r을 사용하여 일부 코드를 테스트하고 있으며 텍스트가 화면 위로 스크롤되는 것을보고 싶지 않으므로 프레임 속도 (예 : 프레임 속도 ( FPS), 나는 printf ( "%-10d \ r", fps); 그러면 다음 줄로 이동하지 않고 커서를 줄의 시작 부분으로 되돌리고 프레임 속도가 동일한 줄에서 지속적으로 업데이트되는 동안 화면에서 스크롤되지 않는 다른 정보를 얻을 수 있습니다 (% -10은 특정 출력은 10 자 이상이며, 왼쪽으로 정렬되어 공백으로 채워져 해당 줄의 이전 값을 덮어 씁니다. 이런 것들에 매우 편리합니다.

작은 역사

/ r은 "return"또는 "carriage return"을 의미하며 타자기에 대한 기록이 있습니다. 캐리지 리턴은 줄의 시작 부분에 입력 할 수 있도록 캐리지를 오른쪽으로 끝까지 이동 시켰습니다.

/ n은 타자기 일부터 새 줄로 이동 한 날부터 "새 줄"을 나타냅니다. 비록 시작에 필연적이지 않기 때문에 일부 OS는 타자기가 수행 한 순서와 같이 / r 리턴과 / n 줄 바꿈이 모두 필요하다는 이유를 채택했습니다. 또한 사용 된 오래된 8 비트 컴퓨터에 대해서도 설명합니다. "캐리지 리턴"에서 "Enter"가 아닌 "Return"을 가져야합니다.


1

혼란을 더하기 위해 브라우저의 HTML 페이지에서 TextArea 요소를 사용하여 간단한 텍스트 편집기를 작업했습니다. CR / LF와 관련한 호환성 문제를 예상하면서 플랫폼을 확인하고 플랫폼에 적용 할 수있는 줄 바꿈 규칙을 사용하는 코드를 작성했습니다.

그러나 실제를 확인할 때 흥미로운 것을 발견했습니다. TextArea에 포함 된 문자를 문자에 해당하는 16 진수 데이터를 생성하는 작은 JavaScript 함수를 통해 .

테스트를 위해 다음 텍스트를 입력했습니다.

안녕하세요, 세계 [입력]

안녕, 잔인한 세상 [enter]

텍스트 데이터를 조사했을 때 얻은 바이트 시퀀스는 다음과 같습니다.

48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 0a 47 6f 6f 64 62 79 65 2c 20 43 72 75 65 6c 20 57 6f 72 6c 64 0a

이제 대부분의 사람들은 이것을보고 0a 바이트는 보이지 않지만이 출력은 Unix / Linux 플랫폼에서 얻은 것으로 생각합니다. 그러나 여기에 문지름이 있습니다.이 시퀀스는 Windows 7 64 비트의 Chrome에서 얻었습니다.

따라서 TextArea 요소를 사용하고 텍스트를 검사하는 경우 TextArea에서 실제 문자 바이트가 반환되는 것을 확인하기 위해 위에서 한 것처럼 출력을 확인하십시오. 다른 플랫폼이나 다른 브라우저에서 이것이 다른지 아직 알지 못했지만 JavaScript를 통해 텍스트 처리를 수행하고 있다면 해당 텍스트 처리 플랫폼을 독립적으로 만들어야합니다.

위 게시물에서 다룬 규칙은 콘솔 출력에 적용 되지만 HTML 요소는 UNIX / Linux 규칙을 따릅니다. 다른 플랫폼 / 브라우저에서 달리 발견하지 않는 한


0
#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

이 예제를 사용하여 \ n 대신 \ n을 넣어보십시오. 작동하지 않으며 이유를 추측하려고합니까?


1
MS DOS, DECS TOPS-10, CP / M, RT-11 등과 같이 ENTER 키를 누를 때 밑줄이있는 OS가 \ r \ n을 보내는 경우에만 작동합니다. OS의 경우 : Multic, Unix 및 Unix-like ( Linux, Minix 등) BeOS, RISCOS 등 ENTER 키는 \ n 문자 만 보냅니다.
Anders

1
ahh yes 키보드는 이전 ReturnEnter. 심지어 내 현대 무선 키보드는 여전히 아래 앤 예전에 화살표 표시 Return(지금 "입력"숫자 키패드의와 일치하는 제목되는 키 Enter에있는 화살표를 표시하지 않습니다 키)
nothingisnecessary

0

\ n (줄 바꿈)과 \ r (캐리지 리턴)의 차이점은 무엇입니까?

특히 \n와 사이에 실질적인 차이가 \r있습니까? 다른 하나 대신 사용해야하는 곳이 있습니까?


\n개행 에 대한 각각의 이스케이프 시퀀스로 짧은 실험을하고 싶습니다.\r 캐리지 리턴 .

이 질문은 언어 독립적이라는 질문을 받았습니다. 그럼에도 불구하고, 우리는 적어도 실험을 수행하기 위해 언어가 필요합니다. 필자의 경우 C ++을 선택했지만 실험은 일반적으로 모든 프로그래밍 언어에 적용 할 수 있습니다.

프로그램은 단순히 for-loop 반복으로 문장을 콘솔에 인쇄하기 위해 반복됩니다.


개행 프로그램 :

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

산출:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

이 결과는 어떤 시스템 에서도 제공되지 않으며이 C ++ 코드를 실행하고 있습니다. 그러나 가장 현대적인 시스템에서는 작동합니다. 자세한 내용은 아래를 참조하십시오.


이제 동일한 프로그램이지만 차이점이 있지만 인쇄 순서가 끝나면 \n대체됩니다 \r.

캐리지 리턴 프로그램 :

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

산출:

7.Walkthrough of the for-loop 

차이점은 어디에 있습니까? 캐리지 리턴 이스케이프 시퀀스를 사용할 때의 차이점은 간단합니다.\r 각 인쇄 시퀀스의 끝에서 를 사용할 때이 시퀀스의 다음 반복이 다음 텍스트 줄에 들어 가지 않는다는 것입니다. 각 인쇄 시퀀스의 끝에서 커서가 다음 줄의 시작으로 뛰어 들었다.

대신 커서를 사용하기 전에 커서가 줄의 시작 부분으로 되돌아갔습니다. \r 캐릭터 . -결과는 인쇄 순서의 각 반복이 이전의 인쇄 순서를 대체하게됩니다.

* 참고 : A \n가 반드시 다음 텍스트 행의 시작으로 이동하지 않아도됩니다. 일부는 일반적으로 더 오래된 운영 체제에서 \n개행 문자 의 결과로 시작뿐만 아니라 다음 줄의 아무 곳으로나 이동할 수 있습니다. 그렇기 때문에 \r \n다음 텍스트 줄을 시작할 때 사용해야 합니다.


이 실험은 인쇄 순서의 반복 결과 와 관련하여 줄 바꿈과 캐리지 리턴의 차이를 보여주었습니다 .

입력 에 대해 논의 할 때프로그램 에 일부 터미널 / 콘솔은 더 나은 이식성, 호환성 및 무결성을 위해 캐리지 리턴을 암시 적으로 개행으로 변환 할 수 있습니다.

그러나 다른 것을 선택하거나 명시 적으로 만 사용해야하는 경우 항상 목적에 맞게 작동하고 엄격하게 구별해야합니다.

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