\ n과 \ r은 Linux와 Windows에서 어떻게 다르게 처리됩니까?


22

\n바늘을 아래로 \r움직이고 바늘을 줄의 시작 부분으로 옮긴다 고 생각 합니다 (왼쪽 정렬)? 그래도 확실하지 않습니다. 그래서 내가 틀렸다면 나를 바로 잡으십시오.

어쨌든, 나는 Windows 및 Linux 핸들 들었다 newlinescarriage returns다르게. 나는 그들이 다르게 처리하는 방법과 기억해야 할 곳을 알고 싶습니다. 대답 해줘서 고마워.


지금까지 나는 그것이 \r\nWindows에서는 괜찮다는 것을 알고 있지만 \n\r그렇지 않다. 나는 \r\n등록 간호사의 약어 이기 때문에 그것을 기억한다 . 또한 \n사람들이 Linux에서 \r사용하는 것과 같은 목적으로 단독으로 사용되지 않는다고 들었습니다 \r\n. \r정말 오래된 MacOS에서 사용됩니다. 그래도 이러한 사실을 확인하지 않았습니다.
千里 ち ゃ ん

4
그들에게 전화하지 마십시오 \r\n이후 어떻게 \n당신이 그것을 사용하는 위치에 따라 처리됩니다. 더 나은 그들에게 전화 CR하고 LF.
Ignacio Vazquez-Abrams

이그나시오, 그 약어는 나에게 의미가 없습니다. 이걸 뭐라고 부르니 :/? OH ... LINE FEED 및 캐리지 리턴. 고마워, 썰매
千里 ち ゃ ん

@ IgnacioVazquez-Abrams \ n은 LF와 동일하지 않습니까? ASCII 차트에서 문자 13 = \ n = LF가 아니십니까?
barlop

1
@barlop : Windows에서 출력 할 때는 C에 없습니다.
Ignacio Vazquez-Abrams

답변:


21

나는 \ n 바늘을 아래로 이동하고 \ r 바늘을 줄의 시작 부분으로 이동한다고 생각합니다 (왼쪽 정렬)? 그래도 확실하지 않습니다

이것은 다소간 사실이지만 대부분 역사적 호기심입니다. 원래 라인 피드 (LF)는 프린터와 하드 카피 터미널 ( 텔레 프린터 ) 에서 한 줄씩 용지를 전진시키는 데 사용되었습니다 . 캐리지 리턴 (CR)은 프린트 헤드를 라인의 시작 부분으로 되돌 렸습니다.

이것은 "텍스트 모드"에서 사용될 때 최신 프린터에서 여전히 작동하지만 오늘날에는 거의 관련이 없습니다.

어쨌든 Windows와 Linux는 줄 바꿈과 캐리지 리턴을 다르게 처리한다고 들었습니다.

차이점은 간단합니다. OS 설계자는 컴퓨터 파일에서 텍스트의 새로운 줄 시작을 나타내는 방법을 선택해야했습니다. 역사적으로 여러 가지 이유로 유닉스 / 리눅스 세계에서 단일 LF 문자가 개행 마커로 선택되었습니다. MS-DOS는 CR + LF를 선택했으며 Windows는 이것을 상속했습니다. 따라서 다른 플랫폼은 다른 규칙을 사용합니다.

실제로 이것은 점점 더 문제가되고 있습니다. 개행 마커는 실제로 "일반 텍스트"를 처리하는 pogram에만 해당되며 그다지 많지는 않습니다. 주로 프로그램 소스 코드, 구성 파일 및 문서가있는 일부 간단한 텍스트 파일에만 영향을줍니다. 요즘에는 이러한 종류의 파일 (편집기, 컴파일러 등)을 처리하는 대부분의 프로그램이 두 줄 바꿈 규칙을 모두 처리 할 수 ​​있으므로 어떤 것을 선택해도 상관 없습니다.

도구가 "그들의"개행 규칙을 고집하는 경우가 있습니다 (예 : Unix 쉘 스크립트는 CR + LF를 사용해서는 안 됨).이 경우 올바른 것을 사용해야합니다.


동일한 질문 : 프로그래밍 언어가 인식 \n\r하고 \n동일합니까? 나는 다른 사람의 PC에서 편집하고 줄 바꿈의 리눅스와 윈도우 버전 모두 포함 된 텍스트 파일을 구문 분석한다면 예를 들어, 수행하는 것입니다 preg_match위해 \n그리고 \n\r나에게 다른 결과를?
千里 ち ゃ ん

@ 千里 ち ゃ ん : 이것은 프로그래밍 언어, 컴파일러 등에 전적으로 의존합니다. 특히, 정규식을 사용하는 경우, 정규식 엔진에 따라 달라집니다. 일부는 다른 줄 끝을 구별합니다. 나는 믿는다).
sleske 2012 년

@ 千里 ち ゃ ん : 일부 시스템 / 프로그래밍 언어 / 정규 표현식 엔진이 다른 줄 바꾸기 규칙을 처리하는 방법에 대한 질문이있는 경우 별도의 질문으로 요청하십시오.
sleske 2012 년

당신은 \ r \ n을 잘못 쓰는 것이 아니라고 쓰고 있어야합니다. 프로그래밍 언어는 개별 문자를 읽을 수 있으며 프로그래머는 입력에 사용 된 문자를 볼 수 있으며 프로그래머는 출력에 대해 원하는대로 할 수도 있습니다. "ABC 쓰기 후 \ r \ r \ r \ n"이라고 말한 것처럼 끝에 붙일 문자는 무엇이든! 일부 다른 문자는 인쇄 할 수없고 그래픽 또는 기타 문자가 없을 수 있습니다. 그들은 println과 같은 내장 함수를 가질 수 있으며, 새로운 라인에 사용하는 것은 둘 중 하나 일 수 있습니다.
barlop

@ 千里 ち ゃ ん 및 일부 프로그래밍 언어를 사용하면 내장 함수 중 하나에서 설정으로 끝나는 lnie를 선택할 수 있으므로 이론적으로는 내장 함수에서도 가능합니다. + 언급했듯이 실제로 원하는 줄 끝을 쓸 수는 있지만 println 함수와 같이 효율적으로 수행하지 못할 수도 있습니다.
barlop

14

CR과 LF

캐리지 리턴 (CR) 및 라인 피드 (LF)를 포함하여 미국 정보 교환 표준 (ASCII) 정의 제어 문자는 프린터의 인쇄 위치를 제어하는 ​​데 사용되었지만 여전히 초기 컴퓨터 프린터 이전의 기계식 타자기.

플랫폼 의존성

Windows에서 텍스트 파일의 기존 줄 구분 기호는 CR이고 LF가 뒤에옵니다.

이전 (OSX 이전) Apple Macintosh 시스템에서 텍스트 파일의 기존 줄 구분 기호는 CR이었습니다.

유닉스와 리눅스에서 텍스트 파일의 전통적인 줄 구분자는 LF입니다.

\ n과 \ r

많은 프로그래밍 및 스크립팅 언어에서 \n"새 줄"을 의미합니다. 때때로 (항상 그런 것은 아님) 이것은 ASCII LINE-FEED 문자 (LF)를 의미합니다. 프린터 나 타자기에서는 실제로 용지를 한 줄 위로 이동합니다.

항상 \r캐리지 리턴 키가있는 기계식 타자기에서 유래 한 ASCII CARRIAGE-RETURN 문자 (CR)는 스프링을 사용하여 용지를 운반하는 롤러 ( "캐리지")가 오른쪽으로 이동하고, 가능한 한. 따라서 현재 입력 위치를 왼쪽 여백으로 설정하십시오.

프로그램 작성

일부 프로그래밍 언어 \n에서 텍스트 파일에서 줄을 끝내거나 구분하는 플랫폼 종속 문자 시퀀스를 의미 할 수 있습니다. 예를 들어 Perl의 경우 print "\n"Linux와 Windows의 문자 시퀀스가 ​​다릅니다.

당신이 런타임 플랫폼의 기본 라인 엔딩을 사용하려면 자바에서 가장 좋은 방법은, 사용하지 않는 것입니다 \n또는 \r전혀. 을 사용해야합니다 System.getProperty("line.separator"). 당신은 사용해야 \n\r관계없이 플랫폼의 LF와 CR 원하는 위치 (HTTP, FTP 및 기타 인터넷 통신 프로토콜에 예를 들어, 사용).

유닉스 stty

유닉스 셸 stty에서이 명령을 사용하여 셸이 이러한 다양한 규칙간에 변환되도록 할 수 있습니다. 예를 들어 stty -onlcr, 쉘은 이후에 나가는 모든 LF를 CR LF로 변환합니다.

Linux 및 OSX는 Unix 규칙을 따릅니다.

텍스트 파일

텍스트 파일은 여전히 ​​매우 중요하고 널리 사용됩니다. 예를 들어 HTML 및 XML은 텍스트 파일의 예입니다. HTTP와 같은 대부분의 중요한 인터넷 프로토콜은 텍스트 파일 규칙을 따르며 줄 끝에 대한 사양을 포함합니다.

프린터

가장 저렴한 프린터가 아닌 대부분의 프린터는 여전히 CR과 LF를 존중합니다. 실제로 가장 널리 사용되는 페이지 설명 언어 (PCL 및 Postscript)의 기본입니다.


1
Java에 대한 참고 사항 : 일반적으로 "\ n 또는 \ r을 전혀 사용하지 않아야"한다는 것은 사실이 아닙니다. Java에서 "\ n"은 항상 LF이고 "\ r"은 항상 CR입니다. 이것은 당신이 원하는 것일 수 있습니다 : 특정 줄 끝 스타일을 원한다면 사용하십시오. 실행중인 컴퓨터의 기본 줄 끝을 명시 적으로 원하면 사용하십시오 line.separator. 그것은 정말로 당신이 원하는 것에 달려 있습니다.
sleske

그리고 BTW는 println()자동 으로을 사용 line.separator하므로 기본 줄 끝을 원할 경우 사용할 수 있습니다 println()(특정 유형의 줄 끝이 필요한 경우 사용하지 말고 명시 적으로 "\ n"등을 사용하십시오).
sleske

@ 썰매 : 좋은 지적. 이에 따라 답변을 업데이트하겠습니다.
RedGrittyBrick

1
\nASCII LF 이외의 제어 문자 (EBCDIC 기반 시스템 이외) 가있는 언어 나 컴파일러 가 있습니까? \n문자열 또는 문자 리터럴에서 의미 가 무엇인지 , 파일이나 출력 장치로 전송하는 효과가 아니라고 언급하고 있습니다.
Keith Thompson

1
@KeithThompson : Java의 경우 : \nJLS는 명시 적으로 표시하기 때문에 항상 ASCII (및 유니 코드) 코드 10입니다 (JLS 3.10.6, "문자 및 문자열 리터럴의 이스케이프 시퀀스"-확인 :-)). 다른 언어의 경우 좋은 질문입니다.
sleske 2019 년

4

요컨대 프린터에는 필요했지만 이제는 OS에서 약간 다르게 작동합니다. 대부분의 경우 CR과 LF를 모두 수행하는 것이 \r\n좋습니다. 대부분의 경우이 방법이 효과적입니다.


리눅스는 그냥 무시합니까, \r아니면 어떤 종류의 행동 변화를 유발합니까?
Aaron Franke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.