
인코딩은 문자를 컴퓨터가 처리할 수 있도록 바이트(byte) 로 변환하는 규칙이다.
문자 → 바이트 : encode
바이트 → 문자 : decode
한국어 환경에서 가장 중요한 인코딩은 다음 세 가지다.
UTF-8
EUC-KR
CP949(MS949)
유니코드 기반 전 세계 문자 표현 가능
가변 길이 인코딩(1~4 byte)
현대 시스템의 기본 표준
이모지 및 특수문자 지원
다국어 안전
웹, DB, API 기본 인코딩
Python의 기본 인코딩도 UTF-8
s = "안녕하세요"
b = s.encode("utf-8")
print(b)
과거 한국어 표준 인코딩
1~2 byte
표현 가능한 글자 수가 제한적(약 2,350자)
확장 한글, 신조어 등을 표현하지 못함
UTF-8과 호환성이 낮음
Microsoft가 EUC-KR을 확장한 한국어 인코딩
EUC-KR의 상위호환
표현 가능한 한글 약 8,822자
윈도우에서 가장 흔하게 사용
공공기관 CSV/엑셀 파일에서 자주 등장
EUC-KR과 유사하지만 동일하지 않음
UTF-8 파일을 CP949로 읽으면 글자가 깨짐
CP949 파일을 UTF-8로 읽어도 마찬가지로 깨짐
깨짐의 원인은 단순하다.
원래 UTF-8 데이터를 CP949로 decode
원래 CP949 데이터를 UTF-8로 decode
encode 방식과 decode 방식이 다르면 글자가 깨진다.
open("data.csv", encoding="cp949")
open("data.csv", encoding="utf-8")
pd.read_csv("file.csv", encoding="cp949")
어떤 인코딩인지 확신이 없을 때:
import chardet
with open("file.csv", "rb") as f:
print(chardet.detect(f.read()))
출력 예시:
{'encoding': 'EUC-KR', 'confidence': 0.99}
value.encode("cp949").decode("utf-8")
value.encode("utf-8").decode("cp949")
복원의 핵심은 깨진 문자열의 현재 상태를 기준으로 encode → decode 순서를 역추적하는 것이다.