## 1. 기본 개념
|구분|UTF-8|UTF-16|
|---|---|---|
|인코딩 단위|1 byte 기반|2 byte(16bit) 기반|
|가변 길이|1~4 바이트|2 또는 4 바이트|
|ASCII 호환|✅ 완전 호환|❌|
|저장 공간|영어 위주면 작음|한글/중국어는 종종 더 큼|
|웹/리눅스 표준|✅ 표준|❌ 특수 목적|
|BOM 필요|❌ 거의 안 씀|✅ 보통 사용|
---
## 2. 저장 원리 비교
### UTF-8
- 문자마다 1~4바이트
- ASCII(영문, 숫자)는 1바이트로 저장
- 한글: 보통 3바이트
예)
```
A → 0x41 (1바이트)
가 → 0xEA B0 80 (3바이트)
😀 → 4바이트
```
### UTF-16
- 대부분 문자: 2바이트
- 이모지 등 일부: 4바이트 (Surrogate pair)
예)
```
A → 00 41 (2바이트)
가 → AC 00 (2바이트)
😀 → D83D DE00 (4바이트)
```
---
## 3. 용량 관점
문자열이 다음과 같을 때 용량 비교:
|내용|UTF-8|UTF-16|
|---|---|---|
|영어만|✅ 작음|❌ 2배|
|한글/중국어 많음|❌ 큼|✅ 작음|
|이모지|거의 동일|거의 동일|
---
## 4. BOM(Byte Order Mark)
### UTF-16은 엔디안 구분 필요
- UTF-16LE → FF FE
- UTF-16BE → FE FF
### UTF-8은 BOM 필요 없음 (있을 경우 문제 발생)
- UTF-8 BOM: EF BB BF → 웹/리눅스에서 종종 에러 원인
---
## 5. 어디서 쓰나?
### UTF-8을 쓰는 경우 ✅ (대부분의 현대 환경)
- 웹
- Linux / macOS
- Git
- Python, Node.js
- API, JSON
- Markdown, HTML
### UTF-16을 쓰는 경우
- Windows 내부 문자열 API
- Java 내부 String
- 특정 MS 제품
---
## 6. 실무 권장 기준
> ✅ **“무조건 UTF-8”이 표준**
특별한 이유 없다면 항상:
```
UTF-8 without BOM
```
---
## 7. 인코딩 깨질 때 증상
|증상|원인|
|---|---|
|ìÂ|UTF-8을 Latin1로 열음|
|한글 깨짐|UTF-8 ↔ UTF-16 혼용|
|파일 첫 글자 이상|BOM 문제|
---
## 8. 요약 한 줄
- **UTF-8**: 웹 표준, 가볍고 호환성 최강 ✅
- **UTF-16**: 내부 처리용, 가끔 특수 목적 ✅
- 일반 문서, 코드, 데이터 → **UTF-8 선택**
---
**관련 문서:** [[인코딩]]