&; HTML 엔티티 인코더 / 디코더
< > & 같은 HTML 특수문자를 엔티티로 바꾸거나, < 😀 처럼 인코딩된 글을 원래 글자로 돌려요. 자주 쓰는 엔티티 표는 눌러서 바로 복사할 수 있어요.
| 글자 | 이름 | 10진수 | 16진수 | 설명 |
|---|---|---|---|---|
| & | & | & | & | 앰퍼샌드 — 항상 바꿔야 함 |
| < | < | < | < | 작다 — 태그 시작이라 항상 바꿔야 함 |
| > | > | > | > | 크다 |
| " | " | " | " | 큰따옴표 — 속성값 안에서 필수 |
| ' | ' | ' | ' | 작은따옴표 (HTML5, 호환성은 '이 더 좋음) |
| (공백) | |   |   | 줄바꿈 없는 공백 |
| (공백) |   |   |   | en 공백 (반각) |
| (공백) |   |   |   | em 공백 (전각) |
| (공백) |   |   |   | 얇은 공백 |
| (공백) | ­ | ­ | ­ | 소프트 하이픈 (줄 끝에서만 보임) |
| (공백) | ‍ | ‍ | ‍ | 폭 없는 결합자 |
| © | © | © | © | 저작권 |
| ® | ® | ® | ® | 등록상표 |
| ™ | ™ | ™ | ™ | 상표 |
| … | … | … | … | 말줄임표 |
| · | · | · | · | 가운뎃점 |
| • | • | • | • | 글머리 기호 |
| – | – | – | – | en 대시 (범위 1–10) |
| — | — | — | — | em 대시 |
| ‘ | ‘ | ‘ | ‘ | 왼쪽 작은따옴표 |
| ’ | ’ | ’ | ’ | 오른쪽 작은따옴표 |
| “ | “ | “ | “ | 왼쪽 큰따옴표 |
| ” | ” | ” | ” | 오른쪽 큰따옴표 |
| « | « | « | « | 왼쪽 겹화살괄호 |
| » | » | » | » | 오른쪽 겹화살괄호 |
| × | × | × | × | 곱하기 |
| ÷ | ÷ | ÷ | ÷ | 나누기 |
| ± | ± | ± | ± | 플러스마이너스 |
| ° | ° | ° | ° | 도 |
| ≤ | ≤ | ≤ | ≤ | 작거나 같다 |
| ≥ | ≥ | ≥ | ≥ | 크거나 같다 |
| ≠ | ≠ | ≠ | ≠ | 같지 않다 |
| ∞ | ∞ | ∞ | ∞ | 무한대 |
| ² | ² | ² | ² | 위 첨자 2 |
| ½ | ½ | ½ | ½ | 2분의 1 |
| µ | µ | µ | µ | 마이크로 |
| ← | ← | ← | ← | 왼쪽 화살표 |
| → | → | → | → | 오른쪽 화살표 |
| ↑ | ↑ | ↑ | ↑ | 위쪽 화살표 |
| ↓ | ↓ | ↓ | ↓ | 아래쪽 화살표 |
| ↔ | ↔ | ↔ | ↔ | 양쪽 화살표 |
| € | € | € | € | 유로 |
| £ | £ | £ | £ | 파운드 |
| ¥ | ¥ | ¥ | ¥ | 엔·위안 |
| ¢ | ¢ | ¢ | ¢ | 센트 |
| § | § | § | § | 절 |
| ¶ | ¶ | ¶ | ¶ | 단락 |
| † | † | † | † | 단검표 (주석) |
| ♥ | ♥ | ♥ | ♥ | 하트 |
| ✓ | ✓ | ✓ | ✓ | 체크 (HTML5) |
| ☆ | ☆ | ☆ | ☆ | 빈 별 (HTML5) |
| ₩ | (이름 없음) | ₩ | ₩ | 원화 기호 — 이름 있는 엔티티가 없어 숫자로 써야 함 |
사용법
- 인코딩을 고르고 HTML에 넣을 글자를 입력하면
<→<처럼 안전한 엔티티로 바뀌어요. 게시판 글, 코드 예제, 이메일 템플릿에 꺾쇠괄호를 그대로 보여 줘야 할 때 써요. - 범위는 보통 최소(
& < > " ')면 충분해요. 인코딩이 깨지는 옛 시스템이나 ASCII만 받는 곳에 넣을 때는 ASCII 밖 문자 모두를 고르면 한글·이모지까지한같은 숫자 참조로 바꿔요. - 디코딩은
<,😀,©같은 이름·10진수·16진수 엔티티를 모두 원래 글자로 돌려요. 크롤링한 텍스트나 API 응답에"가 섞여 나올 때 쓰세요. - 아래 자주 쓰는 엔티티 표의 행을 누르면 그 엔티티가 복사돼요.
HTML 엔티티란?
HTML에서 <는 태그의 시작, &는 엔티티의 시작이라는 특별한 뜻이 있어요. 그래서 이 글자들을 글자 그대로 화면에 보여 주려면 엔티티(문자 참조)로 바꿔 써야 해요. 엔티티는 세 가지 모양이 있어요.
| 형식 | 예 | 설명 |
|---|---|---|
| 이름 (named) | © → © | 읽기 쉬움. HTML5에 2,000여 개가 정의돼 있어요 |
| 10진수 숫자 참조 | © → © | 유니코드 코드포인트(10진수). 모든 글자를 쓸 수 있어요 |
| 16진수 숫자 참조 | © → © | U+00A9 처럼 유니코드 표기와 같아서 찾기 쉬워요 |
| 이모지 | 😀 → 😀 | 코드포인트 하나로 써요 (서로게이트 쌍으로 쪼개지 않음) |
문서가 UTF-8이면 한글·이모지·©는 엔티티 없이 그대로 써도 돼요. 꼭 바꿔야 하는 건 &와 <(그리고 속성값 안의 따옴표)뿐이에요. 는 줄이 그 자리에서 바뀌지 않게 붙여 두는 공백이라 "10 km"처럼 숫자와 단위를 붙일 때 써요.
XSS 막기: 어디에 넣느냐에 따라 이스케이프가 달라요
사용자가 입력한 글을 HTML에 그대로 넣으면 <script>나 <img onerror=…>가 실행되는 XSS(크로스 사이트 스크립팅)가 생겨요. HTML 이스케이프는 기본 방어지만, 값이 들어가는 자리(컨텍스트)마다 필요한 처리가 달라요.
| 넣는 자리 | 필요한 처리 | 주의 |
|---|---|---|
태그 사이 본문 <p>여기</p> | & < > 이스케이프 | 최소 모드로 충분 |
따옴표로 감싼 속성값 title="여기" | & < " ' 이스케이프 | 속성값은 반드시 따옴표로 감싸기 |
URL 속성 href="여기" | URL 인코딩 + 스킴 검사 | javascript: URL은 엔티티로 못 막아요 |
<script> 안 JS 값 | JSON 직렬화 + </ 처리 | HTML 엔티티는 script 안에서 해석되지 않아요 |
style · onclick 속성 | 넣지 않기 | 사용자 값을 넣는 것 자체를 피하세요 |
자바스크립트로 화면에 글을 넣을 때는 innerHTML 대신 textContent를 쓰면 이스케이프가 필요 없어요. React·Vue 같은 프레임워크도 기본으로 이스케이프하지만 dangerouslySetInnerHTML·v-html은 예외예요. 사용자가 쓴 HTML을 일부 허용해야 한다면 직접 이스케이프하지 말고 DOMPurify 같은 검증된 정화(sanitize) 라이브러리를 쓰세요.
이중 인코딩 (&lt;)
이미 인코딩된 <를 한 번 더 인코딩하면 &lt;가 되고, 화면에는 <가 글자 그대로 보여요. 저장할 때 한 번, 출력할 때 또 한 번 이스케이프하면 생기는 흔한 버그예요. 디코딩에서 "남은 엔티티까지 반복 디코딩"을 켜면 여러 겹을 한 번에 풀 수 있어요. 원칙은 저장은 원본 그대로, 출력하는 순간에 한 번만 이스케이프하는 거예요.
모든 변환은 브라우저 안에서만 이뤄져요. 디코딩은 화면에 아무것도 그리지 않는 textarea에서 처리해서, 입력에 스크립트가 있어도 실행되지 않아요. €~Ÿ는 HTML 표준에 따라 windows-1252 글자(예: – → –)로 해석해요.