topic난이도 · 약 15

문자 인코딩 — ASCII·UTF-8·유니코드

글자가 바이트로 바뀌는 규칙. "한글 깨짐"의 범인.

#UTF-8#유니코드#인코딩#CP949#BOM
왜 배우는가

한글 깨짐·이모지 X 표시·CSV 읽을 때 ???·이메일 제목 `=?utf-8?B?...?=` — 전부 인코딩 불일치. UTF-8이 디폴트라는 한 줄만 알아도 90% 해결.

문자 인코딩은 '글자 ↔ 바이트 번역표'다. ① 유니코드(전 세계 모든 글자에 고유 번호 부여, 코드포인트) + ② 인코딩(그 번호를 바이트로 어떻게 저장할지) 둘의 조합.

글자유니코드 코드포인트UTF-8UTF-16
AU+0041`41` (1바이트)`00 41` (2바이트)
éU+00E9`C3 A9` (2)`00 E9` (2)
U+C9DF`EC A7 9F` (3)`C9 DF` (2)
🎉U+1F389`F0 9F 8E 89` (4)`D8 3C DF 89` (4, 서로게이트)

UTF-8이 사실상 웹·파일·API 표준. 장점: ASCII와 호환(영문 1바이트), 가변 길이(한글은 3바이트), BOM 불필요. 2026년 시점 특별한 이유 없으면 무조건 UTF-8.

javascript
// JS 문자열은 내부적으로 UTF-16. 외부와는 UTF-8로 변환.

// 바이트 길이 ≠ 글자 길이
"짓친".length                    // 2 (코드 유닛 수)
new TextEncoder().encode("짓친").length  // 6 (UTF-8 바이트)

// 이모지는 서로게이트 쌍이라 length가 거짓말
"🎉".length                      // 2 ← 예상(1)과 다름
[..."🎉"].length                 // 1 ← 스프레드는 유니코드 기준

// 파일 I/O — 읽을 때 인코딩 명시
const text = await fs.readFile("data.csv", "utf-8");  // ← utf-8 필수
// 생략하면 Buffer가 반환되어 앱에서 "글자 ?????"로 깨짐

// HTTP 헤더
// Content-Type: text/html; charset=utf-8
// HTML 안에는:
// <meta charset="utf-8">

Claude가 만든 코드에서 `length`로 문자열 길이 검증 시 이모지·한글 함정 주의. 글자 수는 `[...str].length` 또는 `Intl.Segmenter`.

CP949·EUC-KR 인코딩 파일을 만나는 경우: 구형 Windows에서 저장된 CSV·TXT. `iconv`로 변환: `iconv -f cp949 -t utf-8 old.csv > new.csv`. Claude에게 "cp949→utf-8 변환 스크립트 짜줘"로 해결.

실기 드릴 2문항
edit실기 드릴 · 단답형

웹·파일·API에서 사실상 표준인 문자 인코딩은?

check_circle실기 드릴 · OX

JS에서 `"🎉".length === 1` 이다.