개행 문자는 참 문제가 많다. 그냥 엔터 아닌가? 하고 넘기면 참 좋겠지만, 엔터도 사실 문자이기 때문이다. 문자라면 그냥 \n
아닌가? 하고 넘기면 또 좋겠지만 이게 아니다.
window에서는 \r\n
, linux는 \n
, Mac OS 구버전에서는 \r
등 다양하다. 문제를 해결하기 전에 이해하는 게 더 중요하니 유래부터 보면 결국 타자기로 거슬러 올라간다.
써본 적은 없지만 키보드와 비슷하게 생긴 옛날 키보드다. 타이핑하면 활자 막대에 잉크를 묻혀 종이에 찍힌다. 이렇게 종이 끝가지 타이핑했으면 다음 줄로 어떻게 내려야 할까?
타자기 왼쪽을 손잡이 하나가 튀어나와 있다. 리턴 레버라 불리는 이 손잡이를 누르고 원위치로 옮기면 다음 줄 처음으로 갈 수 있다.
다음 줄(newline)의 의미를 이 타자기의 동작으로 생각해보면 종이를 한 줄 올리고(라인피드, \n
), 왼쪽으로 이동(캐리지리턴, \r
)하는 두 가지를 뜻한다. CR(Carriage Return)과 LF(Line Feed)는 여기서 유래됐다.
하지만 기술이 발달하면서 타자기처럼 newline을 처리하지 않다 보니 \r
의 의미가 없어졌다. 이런 이유로 각각 다른 시대와 이유로 생성된 OS마다 newline을 해석하는 문자가 다르다.
의미는 같은 newline 이지만 OS마다 서로 다른 문자를 쓰다 보니 이로 인해 클라이언트가 주는 대로 저장한 서버나 공용으로 작업하는 에디터 등에서 확인해보면 온갖 newline 문자가 혼재해 있다. 요새 문자를 보여주는 IDE나 뷰어 등에서는 이 정도 인지능력은 있기 때문에 알아서 newline으로 처리해주지만, 엄연히 문자는 다르기 때문에 문자열 비교를 한다거나 기본 vim, 고대 메모장 등에서 보면 문제가 생긴다.
'기타' 카테고리의 다른 글
분산 트랜잭션 - 2단계 커밋(two-phase commit) (0) | 2020.02.20 |
---|---|
bracketed paste mode (0) | 2020.02.12 |
[bash] history 사용법 (0) | 2020.02.11 |
ssh 터널링 (0) | 2020.02.02 |
mongodb index를 통한 쿼리튜닝 (0) | 2019.12.31 |
댓글