문자 인코딩의 이해: ASCII, Unicode, 그리고 UTF-8
텍스트 파일을 열었는데 é 같은 이상한 문자나 기호들이 가득한 것을 본 적이 있나요?
이것을 Mojibake (글자 깨짐)라고 하며, 컴퓨터가 어떤 "문자 인코딩"을 사용해야 할지 혼란스러워할 때 발생합니다.
그렇다면 문자 인코딩이란 정확히 무엇일까요? 컴퓨터가 텍스트를 처리하는 기본 원리를 살펴보겠습니다.
1. 컴퓨터는 숫자만 압니다
가장 낮은 레벨에서 컴퓨터는 오직 0과 1, 즉 이진수만 이해합니다.
텍스트를 저장하려면 각 문자에 숫자를 할당하는 지도가 필요합니다.
A->65B->66!->33
이 매핑 시스템을 **문자 집합 (Character Set)**이라고 합니다.
2. ASCII: 미국의 표준 (1963)
가장 널리 사용된 최초의 표준은 **ASCII (American Standard Code for Information Interchange)**였습니다.
7비트를 사용하여 128개의 문자를 표현했습니다:
- 영문자 (A-Z, a-z)
- 숫자 (0-9)
- 기본 문장 부호
- 제어 코드 (줄바꿈, 탭)
영어권 사용자들에게는 훌륭했습니다. 하지만 나머지 세상은 어땠을까요?
ASCII는 악센트(é, ñ)는 고사하고 한글이나 한자, 이모지를 표현할 방법이 없었습니다.
3. "확장 ASCII"의 혼란
다른 언어를 지원하기 위해 각 지역마다 ASCII를 8비트로 확장한 독자적인 규격을 만들었습니다.
- ISO-8859-1 (Latin-1): 서유럽 악센트 추가.
- Windows-1252: Latin-1과 비슷하지만 약간의 차이 있음.
- Shift_JIS: 일본어용.
- EUC-KR: 한국어용.
문제점:
EUC-KR로 저장된 파일을 ISO-8859-1로 열면 쓰레기 값처럼 보입니다. 모두를 아우르는 단일 표준이 없었습니다.
4. Unicode: 하나로 통일하다
이 혼란을 해결하기 위해 Unicode가 탄생했습니다. 목표는 세상의 모든 언어의 모든 문자에 고유한 번호(Code Point)를 부여하는 것입니다.
A->U+0041é->U+00E9한->U+D55C💩->U+1F4A9
유니코드는 현재 149,000개 이상의 문자를 정의하고 있습니다.
하지만 유니코드는 숫자의 목록일 뿐입니다. 그 숫자를 바이트로 어떻게 저장할지는 알려주지 않습니다. 여기서 인코딩이 등장합니다.
5. UTF-8: 획기적인 해결책
"그냥 모든 문자에 32비트(4바이트)를 쓰면 되지 않나?"라고 생각할 수 있습니다 (이것이 UTF-32입니다).
하지만 그렇게 하면 8비트만 필요한 영어 텍스트의 파일 크기가 4배로 늘어납니다.
여기서 **UTF-8 (Unicode Transformation Format - 8-bit)**이 등장합니다.
이것은 가변 길이 인코딩입니다:
- 표준 ASCII 문자는 1바이트를 사용합니다. (ASCII와 하위 호환!)
- 유럽 문자는 2바이트를 사용합니다.
- **아시아 문자 (한글, 한자 등)**는 3바이트를 사용합니다.
- 이모지는 4바이트를 사용합니다.
작동 원리
- 바이트가
0으로 시작하면: 1바이트 ASCII 문자입니다. 110으로 시작하면: 2바이트 시퀀스의 시작입니다.1110으로 시작하면: 3바이트 시퀀스의 시작입니다.
이 기발한 설계 덕분에 UTF-8은 영어에 효율적이면서도(ASCII와 크기 동일) 전 세계의 모든 문자를 지원할 수 있습니다.
결론
오늘날 UTF-8은 지배적인 표준이며, 웹사이트의 98% 이상이 사용합니다.
파일을 저장할 때는 항상 UTF-8 (BOM 없음)을 선택하세요. 그러면 언제 어디서나, 어떤 기기에서든 당신의 텍스트를 읽을 수 있습니다.
Pro Tip:
é대신é가 보인다면, 보통 UTF-8 파일이 Windows-1252로 잘못 읽히고 있다는 뜻입니다. `` 같은 것이 보인다면, 바이너리 파일이나 호환되지 않는 인코딩이 텍스트로 읽히고 있다는 뜻입니다.
관련 도구 둘러보기
Pockit의 무료 개발자 도구를 사용해 보세요