유니코드 이스케이프 변환과 복원, 형식 총정리

한글이나 이모지를 \uXXXX 같은 코드로 바꾸는 일도, 반대로 그 코드를 다시 원래 문자로 되돌리는 일도 원리는 하나입니다. 문자를 '코드포인트'라는 정수 하나로 읽은 뒤, 그 정수를 어떤 표기법으로 적느냐의 차이일 뿐입니다.
이 글은 \uXXXX·\u{...}·U+코드포인트·HTML 10·16진 엔티티·이름 엔티티가 각각 무슨 뜻이고 서로 어떻게 다른지, 문자 하나가 각 형식에서 어떤 모습이 되는지를 한글·©·★·👍 예시로 정리합니다.
요약 ① 여섯 가지 형식은 모두 문자의 '코드포인트'(정수 하나)를 다르게 적은 것뿐이라, 가리키는 문자는 같고 표기만 다릅니다. ② U+FFFF를 넘는 이모지는
\u형식에서만 서러게이트 쌍 두 조각(👍)으로 쪼개지고, 나머지 형식은 코드포인트를 그대로 적습니다. ③ 이름 엔티티(©등)는 약 30개만 내장되어 있어, 이름이 없는 문자는 숫자 엔티티(★)로 대신 표시됩니다.
코드에서 한글이 안녕로 보일 때
JSON 파일이나 로그, 자바스크립트 소스에서 한글이 안녕처럼 낯선 코드로 찍혀 있는 걸 본 적이 있을 겁니다. 반대로 HTML에 저작권 기호를 넣어야 하는데 ©를 그대로 쓰기가 꺼려져 ©나 © 같은 표기를 찾는 경우도 있습니다.
이건 문자가 깨진 게 아니라, 같은 문자를 사람이 아니라 기계가 읽기 좋은 형태로 적어둔 것입니다. 한글 '안'은 화면에서는 '안'이지만 컴퓨터 안에서는 U+C548이라는 번호를 가진 문자이고, 안은 그 번호를 자바스크립트 문법으로 적은 것뿐입니다.
문제는 이 표기법이 한 가지가 아니라는 점입니다. \uXXXX, \u{...}, U+, &#숫자;, &#x숫자;, &이름;이 모두 같은 문자를 가리키면서 생김새만 다릅니다. 그래서 "이게 무슨 뜻이고 어떻게 되돌리지?"에서 막히게 됩니다.
도구 없이 직접 변환하는 방법
모든 변환의 출발점은 문자의 코드포인트를 구하는 것입니다. 브라우저 개발자 콘솔에서 "©".codePointAt(0)을 실행하면 169가 나옵니다. 이 10진수를 16진수로 보려면 (169).toString(16)을 실행하면 "a9"가 나옵니다.
이제 이 두 숫자(10진 169, 16진 a9)만 있으면 여섯 형식을 손으로 적을 수 있습니다.
\uXXXX(JS): 16진수를 4자리로 채워\u뒤에 붙입니다 →©\u{...}(ES6): 16진수를 그대로 중괄호에 넣습니다 →\u{a9}U+코드포인트: 16진수를 대문자 4자리로 적습니다 →U+00A9&#DDD;(HTML 10진): 10진수를 그대로 넣습니다 →©&#xHH;(HTML 16진): 16진수를 넣습니다 →©&name;(이름 엔티티): 정해진 이름이 있으면 그 이름 →©
같은 방법을 ©·★·👍에 적용하면 아래 표가 됩니다. 코드포인트만 알면 나머지는 표기 규칙을 따라 적는 기계적인 작업입니다.
| 형식 | © (U+00A9) | ★ (U+2605) | 👍 (U+1F44D) |
|---|---|---|---|
\uXXXX (JS) | © | ★ | 👍 |
\u{...} (ES6) | \u{a9} | \u{2605} | \u{1f44d} |
U+코드포인트 | U+00A9 | U+2605 | U+1F44D |
&#DDD; (10진) | © | ★ | 👍 |
&#xHH; (16진) | © | ★ | 👍 |
&이름; (이름) | © | ★ | 👍 |
반대로 코드를 문자로 되돌리는 것도 같은 숫자만 있으면 됩니다. ©에서 a9를 꺼내 16진수로 읽으면 169이고, String.fromCodePoint(169)를 실행하면 다시 ©가 나옵니다. ©도 결국 10진수 169라서 결과는 같습니다.
여기까지가 도구 없이 하는 전체 과정입니다. 다만 문자가 여러 개이거나 형식이 섞여 있으면 한 글자씩 콘솔에 넣고 다시 조립하는 게 번거롭습니다. 그 반복 작업만 대신 해주는 것이 이 변환기입니다.
저희 도구로 확인하기.
설치·가입 없이 브라우저에서 바로 돌아가는 무료 변환기입니다. 문자 → 코드, 코드 → 문자 양방향을 모두 지원합니다.

자주 헷갈리는 지점
이모지가 두 조각으로 쪼개질 때
👍를 \uXXXX로 바꾸면 👍처럼 두 조각으로 나뉩니다. 오류가 아닙니다. \uXXXX는 16진수 네 자리(U+FFFF)까지만 담을 수 있어서, 그보다 큰 문자는 두 개를 짝지어 표현하도록 정해져 있습니다. 이 짝을 서러게이트 쌍이라고 합니다.
그래서 같은 이모지라도 \u{1f44d}, U+1F44D, 👍 형식에서는 한 덩어리로 나옵니다. 이 형식들은 코드포인트를 그대로 적기 때문입니다. 복원 탭에 넣으면 어느 형식이든 다시 하나의 👍로 돌아옵니다.
안 바뀌는 문자와 없는 이름 엔티티
영문·숫자·기본 기호가 그대로 남는 것도 정상입니다. 'ASCII 문자는 그대로 두기' 옵션이 기본으로 켜져 있어, 코드포인트 0x20~0x7E(공백부터 물결표까지)에 해당하는 문자는 바꾸지 않고 특수문자만 변환합니다. 이 체크를 끄면 A도 A처럼 전부 이스케이프됩니다.
16진수 표기의 대소문자가 형식마다 다르다는 점도 알아두면 덜 헷갈립니다. U+ 형식만 대문자(U+00A9)이고, \u·\u{...}·&#x는 소문자(©, ©)로 나옵니다. 가리키는 값은 같으므로 대소문자 차이로 다른 문자라고 오해할 필요는 없습니다.
모든 특수문자에 &이름;이 있는 것도 아닙니다. 자주 쓰는 약 30개만 내장되어 있어, ©는 ©로 나오지만 ★처럼 이름이 없는 문자는 자동으로 ★ 같은 숫자 엔티티로 대체됩니다. 화면의 '입력 문자'와 '결과 길이' 숫자가 다른 것도 같은 이유인데, 👍는 입력으로는 한 글자지만 \uXXXX 결과로는 열두 글자가 됩니다.
정리
핵심만 추리면 이렇습니다.
- 여섯 형식은 모두 같은 코드포인트를 다르게 적은 것입니다. 뜻은 같고 껍데기만 다릅니다.
- 변환의 출발점은 코드포인트입니다.
"문자".codePointAt(0)으로 정수를 구한 뒤 형식별 규칙대로 적으면 됩니다. \u는 네 자리(U+FFFF)까지만 담기므로, 그보다 큰 이모지는 서러게이트 쌍 두 조각으로 나뉩니다. 다른 형식은 코드포인트를 그대로 씁니다.- 'ASCII 문자는 그대로 두기'가 기본이라 영문·숫자·기본 기호는 그대로 두고 특수문자만 바꿉니다.
- 이름 엔티티는 약 30개만 있어, 이름이 없으면 변환기가 자동으로 숫자 엔티티로 표시합니다.
설치·가입 없이 브라우저에서 바로 돌아가는 무료 변환기입니다. 문자 → 코드, 코드 → 문자 양방향을 모두 지원합니다.
자주 묻는 질문
이모지를 \u 형식으로 바꾸니 두 조각으로 나뉘어요. 오류인가요?
아닙니다. \uXXXX는 16진수 네 자리(U+FFFF)까지만 표현할 수 있어, 그보다 큰 문자는 두 개의 \u를 짝지은 서러게이트 쌍(👍)으로 나타냅니다. \u{1f44d}, U+1F44D, 👍 형식은 한 덩어리로 나오고, 복원 탭에 넣으면 어떤 형식이든 다시 하나의 👍로 돌아옵니다.
영문과 숫자는 왜 안 바뀌나요?
'ASCII 문자는 그대로 두기' 옵션이 기본으로 켜져 있기 때문입니다. 코드포인트 0x20~0x7E에 해당하는 문자(공백·영문·숫자·기본 기호)는 그대로 두고 특수문자만 바꿉니다. 이 옵션을 끄면 A도 A처럼 전부 이스케이프됩니다.
여러 형식이 섞인 코드도 한 번에 되돌릴 수 있나요?
됩니다. 복원 탭은 \u{...}, \uXXXX, \xXX, U+XXXX, &#xHH;, &#DDD;, 이름 엔티티를 각각 인식합니다. 예를 들어 안녕 © U+1F44D를 넣으면 안녕 © 👍로 한 번에 복원됩니다.
모든 특수문자에 &이름; 엔티티가 있나요?
아닙니다. 자주 쓰는 약 30개 이름만 내장되어 있습니다. ©는 ©, €는 €처럼 나오지만, ★처럼 지정된 이름이 없는 문자는 ★ 같은 숫자 엔티티로 대체됩니다. 그래서 이름이 없는 문자는 변환기가 알아서 숫자 엔티티로 표시합니다.
