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


22

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

어쨌든, 나는 Windows 및 Linux 핸들 들었다 newlines과 carriage 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.