## 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 선택** --- **관련 문서:** [[인코딩]]