한글 음절(예: "안", "녕")은 유니코드에서 완성형으로 하나의 코드 포인트를 차지한다. 그래서 "\uXXXX"로 이스케이프하면 "안녕"은 정확히 두 개의 \uXXXX 시퀀스, 즉 안녕가 된다 — 자음과 모음을 별도의 결합 문자로 쪼개는 베트남어 등의 스크립트와 달리, 화면에 보이는 글자 수와 이스케이프된 시퀀스 수가 정확히 일치한다는 뜻이다. 다만 이렇게 나온 유니코드 코드 포인트는 정규식에서 자모 단위가 아니라 음절 단위로만 매칭된다는 점은 주의할 필요가 있다.
JavaScript/JSON 문자열에서의 이스케이프
JS 문자열 리터럴과 JSON에서는 백슬래시로 특수 문자를 이스케이프한다: 따옴표는 \", 줄바꿈은 \n, 백슬래시 자체는 \\. JSON은 추가로 모든 문자열이 큰따옴표를 사용하도록 요구한다 — 작은따옴표도 허용하는 JS와는 다른 점이다.
셸 명령어에서의 이스케이프
명령줄에서는 공백, 따옴표, 달러 기호, 별표 등이 특수 문자에 해당하며, 셸에 대해 특별한 의미를 가진다. 명령어 인자 안의 공백은 이스케이프하거나 인자 전체를 따옴표로 감싸야 한다. 그렇지 않으면 셸이 이를 두 개의 별도 인자로 나눠버린다.
정규식에서의 이스케이프
정규식에서는 점, 별표, 괄호 같은 문자가 특별한 의미를 가진다(임의의 문자, 수량자, 그룹). 이를 메타문자가 아닌 문자 그대로 매칭하려면 앞에 백슬래시를 붙인다: \.은 "임의의 문자"가 아니라 리터럴 점 하나에 매칭된다.
각 컨텍스트마다 별도 이스케이프가 필요한 이유
"이중 이스케이프"나 "이스케이프 부족" 오류는 사용자 텍스트(예: 공백이 포함된 파일 경로)를 명령어나 문자열에 삽입할 때 코드가 깨지는 가장 흔한 원인 중 하나다. 올바른 이스케이프는 텍스트 자체가 아니라 그 텍스트가 정확히 어디에 삽입되는지에 따라 달라진다.
왜 필요한가
- 한글이 포함된 사용자 텍스트를 JSON 요청에 안전하게 삽입할 수 있도록 준비한다.
- 명령어 삽입(command injection) 위험 없이 동적 인자를 포함한 셸 명령어를 구성한다.
- 텍스트를 정규식의 리터럴 패턴으로 사용하기 전에 특수 문자를 이스케이프한다.
중첩된 컨텍스트에서의 이중 이스케이프
텍스트가 연속으로 두 개의 컨텍스트를 거칠 때 — 예를 들어 문자열이 JSON에 삽입되고, 그 JSON이 다시 셸 명령어의 인자로 전달될 때 — 이스케이프는 올바른 순서로 적용해야 한다: 먼저 안쪽 컨텍스트(JSON), 그다음 바깥쪽 컨텍스트(셸) 순서다. 순서가 뒤바뀌거나 한 단계를 건너뛰는 것은 "제대로 이스케이프한" 문자열이 실제로는 여전히 깨지는 흔한 원인이다.