JSON 이스케이프
어떤 텍스트든 JSON 안에 안전하게 넣을 수 있는 문자열로 바꿉니다.
붙여 넣은 것은 여러분의 브라우저를 떠나지 않습니다. connect-src 허용 목록 덕분에 이는 약속이 아니라 브라우저가 강제하는 보장입니다. 직접 확인하기
아무 텍스트나 JSON 문자열 안에 안전하게 넣을 수 있는 형태로 바꿉니다. 따옴표, 백슬래시, 줄바꿈, 탭, 제어 문자는 이스케이프하고 나머지는 그대로 둡니다.
페이로드, 로그 한 줄, SQL 질의, HTML 조각을 손으로 JSON 필드에 끼워 넣을 때 필요한 작업입니다.
무엇을 이스케이프해야 하고 무엇은 아닌가
JSON은 이스케이프 시퀀스를 정확히 아홉 개 정의하고, 이스케이프를 요구하는 상황은 정확히 세 가지입니다.
- 큰따옴표
- \"가 됩니다. 그러지 않으면 거기서 문자열이 끝나 버립니다.
- 백슬래시
- \\가 됩니다. 그러지 않으면 이스케이프가 시작됩니다.
- 제어 문자, U+0000부터 U+001F까지
- 줄바꿈은 \n, 탭은 \t, 캐리지 리턴은 \r, 백스페이스는 \b, 폼 피드는 \f가 됩니다. 그 범위의 나머지는 \uXXXX 형태를 씁니다.
- 슬래시
- \/로 이스케이프할 수 있지만 꼭 그럴 필요는 없습니다. 두 표기 모두 같은 문자를 뜻합니다. 이 이스케이프가 있는 이유는 HTML의 script 요소 안에 JSON을 넣을 수 있게 하기 위해서인데, 거기서는 </ 라는 배열이 요소를 끝내 버립니다.
- ASCII가 아닌 문자
- 이스케이프가 전혀 필요 없습니다. JSON은 UTF-8이고 é, 你, 🎉 모두 그대로 써도 됩니다. 여기서 이스케이프를 선택할 수 있게 한 건 전송 중에 비ASCII를 망가뜨리는 시스템 때문입니다.
- 작은따옴표
- 아무것도 필요 없습니다. 큰따옴표로 감싼 문자열 안에서는 평범한 문자이고, \'는 유효한 JSON 이스케이프가 아닙니다.
서로게이트와 이모지
기본 다국어 평면 바깥의 문자는 모든 이모지를 포함해 UTF-16 코드 유닛 두 개로 저장됩니다. 이스케이프하면 \u 시퀀스가 두 개 나오고, 파티 크래커라면 \ud83c\udf89입니다. 이건 올바른 표기이며 모든 파서가 원래 문자를 되살립니다.
짝이 없는 서로게이트 하나는 다른 걸 전혀 이스케이프하지 않는 설정에서도 항상 이스케이프합니다. 그대로 내보내면 형식에 맞지 않는 유니코드가 되고, UTF-8로 다시 인코딩하는 순간 깨지기 때문입니다.
대개는 이쪽이 더 나은 답
JSON을 만들려고 손으로 이스케이프하고 있다면, 멈추고 직렬화를 쓰세요. JSON.stringify, json.dumps와 그 동류들은 구조적으로 모든 값을 올바르게 이스케이프하고, 하나를 빠뜨릴 수가 없습니다.
손으로 만든 JSON이야말로 잘못된 제어 문자와 끝나지 않은 문자열에 관한 거의 모든 오류의 근본 원인입니다.
How to do this in code
코드에서의 이스케이프.
js JavaScript
// Escaped and quoted
const quoted = JSON.stringify(text);
// Escaped without the surrounding quotes
const escaped = JSON.stringify(text).slice(1, -1); py Python
import json
quoted = json.dumps(text) # with quotes, non-ASCII escaped
quoted = json.dumps(text, ensure_ascii=False) # with quotes, é stays é
escaped = json.dumps(text)[1:-1] sh Shell
# jq's @json filter escapes and quotes
printf '%s' "$text" | jq -Rs @json
# -R reads raw input, -s slurps it into one string go Go
b, _ := json.Marshal(text) // includes the quotes
// Marshal escapes <, > and & by default for HTML safety.
// To turn that off you need an Encoder:
var buf bytes.Buffer
enc := json.NewEncoder(&buf)
enc.SetEscapeHTML(false)
enc.Encode(text) 자주 묻는 질문
- 작은따옴표도 이스케이프해야 하나요?
- 아닙니다. 큰따옴표로 감싼 JSON 문자열 안에서 아포스트로피는 평범한 문자이고, \'는 애초에 유효한 JSON 이스케이프가 아닙니다. JavaScript와 JSON5에서는 유효하며, 습관은 거기서 옵니다.
- ASCII가 아닌 문자를 이스케이프해야 하나요?
- 보통은 아닙니다. JSON은 UTF-8이고 악센트 문자, CJK, 이모지 모두 그대로 써도 됩니다. 파이프라인 어딘가가 비ASCII를 망가뜨릴 때만 이스케이프하세요. 그리고 그건 파이프라인을 고쳐야 할 이유입니다.
- 윈도우 경로는 어떻게 되나요?
- 모든 백슬래시가 두 개가 됩니다. C:\\Users\\priya처럼요. 백슬래시 하나로 끝나는 경로는 그냥 틀린 것보다 더 나쁩니다. 닫는 따옴표를 이스케이프해서 문서의 나머지를 통째로 삼켜 버리기 때문입니다.