Python

파이썬 인코딩 방식 완벽 정리: UTF-8, cp949 오류 해결법까지!

miniverse-lab 2025. 4. 13. 13:21
파이썬 인코딩, 왜 알아야 할까?

파이썬으로 파일을 읽거나 쓸 때, 혹은 크롤링 데이터를 처리할 때 "UnicodeDecodeError" 또는 "cp949 codec can't decode byte" 같은 오류를 본 적 한 번쯤은 있으시죠?

이 문제의 원인은 바로 "인코딩 방식"의 차이에서 오는 문제 때문입니다.

파이썬은 강력한 텍스트 처리 기능을 제공하지만, 문자 인코딩을 제대로 이해하지 못하면 파일을 제대로 읽지도, 쓰지도 못하는 경우가 많습니다.

이 포스팅에서는 파이썬에서 자주 쓰이는 인코딩 방식과, 인코딩 에러 해결법까지 친절하게 정리해 드릴게요.

 

인코딩이란?

인코딩(Encoding)이란 컴퓨터가 문자를 저장하거나 전달할 수 있도록 문자 → 숫자(바이트)로 변환하는 방식입니다.

예를 들어 "안녕하세요"라는 문자열은 사람이 보기엔 한글이지만, 컴퓨터 입장에선 바이트(01001010...)로 저장되어야 합니다.

이때 어떤 기준으로 "안녕하세요" 라는 한글을 바이트로 바꿀지를 정하는 것이 바로 인코딩 방식입니다.

 

파이썬에서 지원하는 인코딩 리스트 확인하는 방법
import encodings.aliases
encodings_list = sorted(set(encodings.aliases.aliases.values()))
encodings_list

파이썬에서 제공하는 인코딩 리스트는 "import encodings.aliases"를 통해 확인할 수 있습니다.

 

파이썬에서 제공하는 encoding_list의 총 len을 살펴보면 99개로 정말 많은데요. 99개를 전부 설명하기에는 너무 많으니 그중에서 주로 사용되는 인코딩 방식들에 대한 설명 및 용도를 테이블로 정리해 보았습니다

 

 

읽고자 하는 파일의 인코딩 방식을 확인하는 방법

파이썬에서 파일을 읽고자 할 때 "encoding=" 해당 부분의 들어가는 인코딩 방식을 자주 사용되는 인코딩 방식 몇 개를 랜덤 하게 바꿔가면서 읽으시지는 않으셨나요?

파이썬에서 읽고자 하는 파일의 인코딩 방식을 " chardet "라이브러리를 이용하여 확인할 수 있습니다.

 

먼저 Test를 위해 메모장에 한국말을 입력한 파일을 korean.txt라고 저장해 보겠습니다

 

# pip install chardet
import chardet

with open('korean.txt', 'rb') as f:
    result = chardet.detect(f.read())
    print(result)


"import chardet"를 통해 korean.txt 파일의 인코딩 방식을 확인해 보면

 

다음과 같이 korean.txt로 저장된 파일의 인코딩 방식은 "utf-8"의 인코딩 방식이라는 것을 확인할 수 있습니다. 

 

윈도우에서 파일을 열면 안 깨지는데 파이썬에서는 깨지는 이유?

윈도우 메모장은 기본적으로 CP949를 사용합니다. 반면 파이썬은 기본이 UTF-8이라 서로 인식 방식이 달라서 파이썬에서 파일이 깨져서 읽힐 수 있습니다.

 

그냥 귀찮은데 UTF-8로 통일해서 저장하면 안 되나?

이상적으로는 모든 파일을 UTF-8로 통일하는 것이 좋습니다. 하지만 외부에서 받은 파일, 오래된 시스템에서는 CP949나 EUC-KR이 많습니다. 따라서 본인이 저장하는 파일의 인코딩 방식은 utf-8 형태로 통일하되 전달받은 파일들은 앞서 설명한 인코딩 확인하는 방법을 활용하여 인코딩 방식을 확인 후 읽는 것을 추천드립니다.

 

크롤링할 때 인코딩 문제는 왜 생기나?


웹 페이지의 문자 인코딩 방식이 서버마다 다르기 때문입니다. 웹 서버가 어떤 문자셋(encoding)으로 HTML을 인코딩했는지 명확하게 알려주지 않거나, 실제 내용과 다르게 선언한 경우도 많아서 혼란이 생겨서 나타나는 문제입니다.