초보 데이터 분석가를 위한 문자 인코딩
인코딩이란?
컴퓨터가 문자를 숫자로 변환하는 방식을 인코딩이라 부릅니다. 컴퓨터는 숫자 연산만 할 수 있죠. 정확히는 0과 1로만 이루어진 이진 연산만 합니다. 그래서 사람이 쓰는 십진법 숫자도 이진법으로 변환해 연산하죠. 그럼 문자는 어떻게 처리할까요? 인코딩은 컴퓨터가 문자를 이해하기 위한 가장 기본적인 방식입니다. 특히 한글이나 비영어권 문자를 포함하는 데이터를 다룬다면 더욱 잘 알아야 합니다.
문자를 변환하는 방식은 너무나도 많겠지만 몇 가지 잘 알려진 방법과 규칙이 있습니다. 컴퓨터가 서로 다른 방식으로 변환한다면 서로가 서로를 이해하지 못하겠죠. 변환하는 방식이 다르면 엉뚱한 글자가 표시됩니다. 흔히 파일이나 문자가 깨졌다고 표현하죠. 데이터 분석을 하려면 일반 텍스트 파일도 읽어야 하고, 엑셀 파일도 읽어야 하고, CSV 파일도 읽어야 합니다. 그 파일을 만든 운영 체제까지 다를 때가 많습니다. 인코딩 방식을 잘 알아두지 못하면 불러온 데이터가 와장창 깨질겁니다. 운영 체제와 프로그램과 파일 형식에 따라 사용하는 인코딩 방식이 다르기 때문입니다.
주요 인코딩 방식
ASCII (American Standard Code for Information Interchange)
특징:
- 7비트 인코딩으로 총 128개 문자 표현
- 영문 알파벳, 숫자, 기본 특수문자만 지원
- 한글, 한자 등 비영문 문자는 표현 불가능
- 가장 기본적이고 오래된 인코딩 방식
사용 범위:
- A-Z, a-z (영문 대소문자)
- 0-9 (숫자)
- 특수문자 및 제어문자
예시:
- 'A' = 65
- 'a' = 97
- '0' = 48
EUC-KR (Extended Unix Code - Korea)
특징:
- 한글 완성형 인코딩
- 2바이트로 한글 표현
- KS X 1001 표준에 정의된 2,350개의 한글만 지원
- "쀍", "똠" 같은 일부 한글은 표현 불가능
장점:
- UTF-8보다 한글 저장 시 용량이 작음
- 오래된 한국 시스템과의 호환성
단점:
- 모든 한글을 표현할 수 없음
- 다국어 지원 불가능
- 현대적인 웹 환경에서는 권장되지 않음
사용처:
- 구형 한국 웹사이트
- 레거시 시스템
CP949 (Code Page 949) / MS949
특징:
- EUC-KR의 확장판 (Microsoft 확장)
- 11,172개 모든 한글 조합 지원
- Windows 한국어 버전의 기본 인코딩
장점:
- 모든 한글 표현 가능
- EUC-KR과 하위 호환
단점:
- Microsoft 전용 확장이라 표준이 아님
- 여전히 다국어 지원 한계
UTF-8 (Unicode Transformation Format - 8bit)
특징:
- 가변 길이 인코딩 (1~4바이트)
- 전 세계 모든 문자 표현 가능
- ASCII와 하위 호환 (ASCII 문자는 1바이트)
- 현재 웹 표준 인코딩
바이트 구조:
- 영문, 숫자: 1바이트
- 한글: 3바이트
- 이모지: 4바이트
장점:
- 전 세계 모든 언어 지원
- ASCII와 완벽 호환
- 웹 표준 (전체 웹페이지의 98% 이상 사용)
- 플랫폼 독립적
단점:
- 한글 저장 시 EUC-KR보다 용량이 큼
- 가변 길이라 문자 수 계산이 복잡
예시:
- 'A' =
41(1바이트) - '한' =
ED 95 9C(3바이트) - '🎉' =
F0 9F 8E 89(4바이트)
UTF-8-SIG (UTF-8 with BOM)
특징:
- UTF-8과 동일하지만 파일 맨 앞에 BOM(Byte Order Mark) 추가
- BOM:
EF BB BF(3바이트)
장점:
- Windows 프로그램들이 UTF-8을 더 잘 인식
- Excel에서 한글 CSV 파일 깨짐 방지
단점:
- 웹에서는 BOM이 불필요하고 문제를 일으킬 수 있음
- Unix/Linux 환경에서는 권장되지 않음
사용처:
- Excel용 CSV 파일
- Windows 메모장 호환
Python 예시:
<!-- -->
# Excel에서 한글이 깨지지 않게 CSV 저장
import pandas as pd
df.to_csv('data.csv', encoding='utf-8-sig', index=False)
UTF-16 / UTF-32
UTF-16 특징:
- 2바이트 또는 4바이트로 인코딩
- Windows 내부적으로 사용 (Win32 API)
- BOM 필요 (Little Endian: FF FE, Big Endian: FE FF)
UTF-32 특징:
- 모든 문자를 4바이트 고정 길이로 표현
- 메모리 낭비가 심함
- 문자 인덱싱은 쉬움
사용처:
- Windows 시스템 내부
- Java 내부 문자열 표현
- 일반적인 파일 저장에는 거의 사용 안 함
ISO-8859-1 (Latin-1)
특징:
- 1바이트 인코딩
- 서유럽 언어(영어, 프랑스어, 독일어 등) 지원
- 한글 표현 불가능
사용처:
- 구형 유럽 시스템
- 일부 레거시 웹사이트
인코딩 선택 가이드
새 프로젝트를 시작한다면?
→ UTF-8을 사용하세요
거의 모든 경우에 UTF-8이 정답입니다. 웹 표준이며 모든 언어를 지원합니다.
Excel용 CSV를 만든다면?
→ UTF-8-SIG를 사용하세요
df.to_csv('file.csv', encoding='utf-8-sig')
레거시 한국 시스템과 연동한다면?
→ CP949 또는 EUC-KR을 사용하세요
하지만 가능하면 시스템을 UTF-8로 업그레이드하는 것이 좋습니다.
영문만 사용한다면?
→ UTF-8 또는 ASCII
UTF-8이 ASCII와 호환되므로 UTF-8 사용을 권장합니다.
인코딩 문제 해결
한글이 깨져 보이는 경우
증상: 한글 → 한글 원인: UTF-8로 저장된 파일을 EUC-KR로 읽음 해결: 올바른 인코딩 지정
<!-- -->
# 파일 인코딩 자동 감지
import chardet
with open('file.txt', 'rb') as f:
result = chardet.detect(f.read())
print(result['encoding'])
<!-- -->
# 올바른 인코딩으로 다시 읽기
with open('file.txt', 'r', encoding='utf-8') as f:
content = f.read()
인코딩 변환
<!-- -->
# EUC-KR → UTF-8 변환
with open('old.txt', 'r', encoding='euc-kr') as f:
content = f.read()
with open('new.txt', 'w', encoding='utf-8') as f:
f.write(content)
현대 개발 환경의 표준
지금까지 이야기한 인코딩 방식을 가볍게 정리하겠습니다:
- ASCII: 가장 기본적인 영문 전용 인코딩
- EUC-KR / CP949: 한국에서 사용되던 인코딩들
- UTF-8: 현재의 웹 표준
- UTF-8-SIG: Excel 호환용
- UTF-16/32: 특수 목적용
2025년 현재는 주로 UFT-8을 사용합니다. 웹 표준이기 때문이죠.
- 웹: UTF-8 (98% 이상)
- 데이터베이스: UTF-8 / UTF8MB4 (MySQL)
- Python 3: 기본 UTF-8
- JSON, XML: UTF-8
- Git: UTF-8
저는 보통 UTF-8을 기본으로 생각합니다. 하다가 데이터를 잘 못불러온다 하면 cp949로 바꿔봅니다. 그리고 엑셀 파일을 다룬다 싶으면 UTF-8-SIG를 사용합니다. 이런 식으로 몇 가지 요령만 터득하면 데이터 깨짐 현상을 크게 줄이고 스트레스도 줄일 수 있습니다.