문자열 이스케이프, 무엇이 어떻게 바뀌나

따옴표·백슬래시·줄바꿈이 섞인 텍스트를 JSON이나 자바스크립트 문자열에 그대로 붙여넣으면 문자열이 중간에 끊기거나 문법 에러가 납니다. 이스케이프는 이런 문자를 문자열 안에서 안전한 표기로 하나씩 바꿔 넣는 작업이고, 언이스케이프는 그 반대 방향입니다.
이 글은 원본의 각 특수문자가 결과에서 정확히 무엇으로 바뀌는지 표로 보여주고, 사람들이 자주 틀리는 지점을 "결과를 어떻게 읽는가"의 관점에서 정리합니다.
요약 ① 이스케이프는 원본을 한 글자씩 훑어 백슬래시는
\\, 선택한 따옴표는\", 줄바꿈은\n, 탭은\t, 그 밖의 0x20 미만 제어문자는\uXXXX로 바꿉니다. ② 방향이 반대인 언이스케이프는\n\t\uXXXX같은 표기를 원래 문자로 되돌리고, 양끝 따옴표가 남아 있으면 자동 제거 옵션으로 벗겨야 결과가 어긋나지 않습니다. ③ 자주 틀리는 곳은 백슬래시를 먼저 처리하지 않아 이중으로 바뀌거나, 입력 따옴표와 선택한 따옴표가 달라 예상과 다른 결과가 나오는 지점입니다.
붙여넣는 순간 따옴표에서 끊기고 줄바꿈에서 에러가 납니다
여러 줄짜리 로그 메시지나 API 응답 텍스트를 JSON 설정 파일의 값 하나에 넣어야 하는 상황을 떠올려 보겠습니다. 그 텍스트에는 대개 큰따옴표가 들어 있고, 여러 줄이라 실제 줄바꿈도 포함되어 있습니다.
이걸 "..." 사이에 그대로 붙여넣으면, 본문 속 큰따옴표가 문자열을 감싸는 큰따옴표와 충돌해 그 지점에서 문자열이 끊깁니다. 게다가 JSON과 자바스크립트의 일반 문자열은 값 안에 실제 줄바꿈 문자를 담는 것을 허용하지 않아, 줄이 바뀌는 자리마다 문법 에러가 납니다.
윈도우 경로도 흔한 사례입니다. C:\new\test 를 문자열에 그대로 넣으면 \n 과 \t 가 각각 줄바꿈과 탭으로 해석돼, 화면에 찍히는 값이 원본과 달라집니다. 이런 문자들을 "문자열 안에서 안전한 표기"로 바꾸는 것이 이스케이프입니다.
도구 없이 직접 이스케이프하는 방법
원리는 단순합니다. 원본을 왼쪽부터 한 글자씩 읽으면서, 문자열 리터럴을 깨뜨릴 수 있는 문자만 정해진 표기로 바꾸면 됩니다. 순서가 중요합니다.
- 감쌀 따옴표를 정합니다. 결과를 큰따옴표 리터럴에 넣을지, 작은따옴표에 넣을지, 백틱에 넣을지에 따라 이스케이프 대상이 달라집니다. 기본값은 큰따옴표입니다.
- 백슬래시를 가장 먼저 바꿉니다. 백슬래시(
\)를\\로 바꿉니다. 이 작업을 맨 처음 해야 하는 이유는, 뒤에서 따옴표를 이스케이프하며 새로 넣게 될 백슬래시까지 다시 건드리는 이중 처리를 막기 위해서입니다. - 선택한 따옴표를 바꿉니다. 고른 따옴표 앞에 백슬래시를 붙입니다. 큰따옴표를 골랐다면
"는\"가 됩니다. 이때 고르지 않은 다른 종류의 따옴표는 건드리지 않습니다. - 개행 계열 문자를 표기로 바꿉니다. 줄바꿈은
\n, 캐리지 리턴은\r, 탭은\t, 백스페이스는\b, 폼피드는\f로 바꿉니다. - 남은 제어문자를 처리합니다. 위에 이름이 없는 0x20 미만의 제어문자(널, 수직 탭, ESC 등)는
\u뒤에 네 자리 16진수를 붙인\uXXXX형태로 바꿉니다.
각 원본 문자가 결과에서 어떻게 대응되는지 정리하면 다음과 같습니다.
| 원본 문자 | 이스케이프 결과 |
|---|---|
백슬래시 \ | \\ |
선택한 따옴표(기본 ") | \" |
| 줄바꿈(LF) | \n |
| 캐리지 리턴(CR) | \r |
| 탭 | \t |
| 백스페이스 | \b |
| 폼피드 | \f |
| 그 밖의 0x20 미만 제어문자 | \uXXXX |
여기에 두 가지 선택지가 더 있습니다. 따옴표로 감싸기를 켜면 결과 전체를 선택한 따옴표로 한 번 감싸 바로 붙일 수 있는 리터럴로 만듭니다. 비ASCII도 \u 이스케이프를 켜면 한글·이모지처럼 ASCII 범위를 벗어난 문자도 \uXXXX 로 바꾸는데, U+FFFF를 넘는 문자(대부분의 이모지)는 서러게이트 쌍 두 개(\uXXXX\uXXXX)로 나뉩니다.
반대 방향인 언이스케이프는 규칙을 되짚습니다. \ 를 만나면 다음 글자를 보고 \n \r \t \b \f \v \0 은 해당 제어문자로, \xXX \uXXXX \u{XXXXX} 는 코드에 해당하는 문자로, 이스케이프된 따옴표·백슬래시·슬래시는 원래 기호로 되돌립니다. 문자열 양끝을 같은 따옴표가 감싸고 있으면 그 한 쌍을 벗겨냅니다.
방향 차이가 하나 있습니다. 이스케이프는 수직 탭과 널 문자를 \v \0 이 아니라
