Python 오류 해결: Python 한글 깨짐 해결하기
저도 처음에 PATH에서 막혔던 것처럼, Python 한글 문제에서도 비슷하게 한참을 헤맨 적이 있습니다. 분명 코드에는 멀쩡하게 한글을 입력했는데, 막상 실행하면 화면에 UnicodeDecodeError가 뜨거나 알 수 없는 특수문자로 도배된 결과가 출력되어서 당황스러웠습니다. 파일을 새로 만들어도 보고 코드를 다시 써봐도 똑같길래 제 코드가 잘못된 줄 알았는데, 알고 보니 원인은 코드가 아니라 파일이 저장된 인코딩 방식과 실행 환경의 문자 설정이 서로 어긋나 있었던 것이었습니다. 이번 글에서는 그때 겪었던 경험을 바탕으로, VS Code에서 Python을 사용할 때 자주 마주치는 한글 깨짐 문제의 원인과 해결 방법을 정리해보겠습니다.
한글이 깨지는 근본 원인
인코딩이란 무엇인가
컴퓨터는 문자를 그대로 저장하는 것이 아니라 정해진 규칙에 따라 숫자로 변환해서 저장합니다. 이 변환 규칙을 인코딩이라고 부르는데, 대표적으로 영어권에서 주로 쓰이는 ASCII, 전 세계 문자를 대부분 표현할 수 있는 UTF-8, 그리고 한글 윈도우에서 오랫동안 기본값으로 사용되어온 CP949(EUC-KR) 등이 있습니다.
비유하자면 인코딩은 마치 서로 다른 나라의 우편번호 체계와 같습니다. 같은 숫자라도 나라마다 가리키는 주소가 다르듯, 같은 바이트값이라도 어떤 인코딩 규칙으로 해석하느냐에 따라 전혀 다른 문자로 표시될 수 있습니다. 파일을 저장할 때 사용한 우편번호 체계와, 읽을 때 사용하는 우편번호 체계가 다르면 엉뚱한 주소, 즉 깨진 글자가 나타나는 것입니다.
한글 깨짐이 발생하는 대표적인 상황
- 파일을 읽거나 쓸 때 인코딩을 지정하지 않은 경우
- 콘솔(터미널) 자체의 문자 인코딩 설정이 다른 경우
- CSV나 텍스트 파일을 다른 프로그램에서 받아왔을 때 인코딩이 다른 경우
- 소스 코드 파일 자체가 잘못된 인코딩으로 저장된 경우
- 운영체제 기본 인코딩이 UTF-8이 아닌 경우
파일 입출력에서 발생하는 한글 깨짐 해결하기
open() 함수에 인코딩 명시하기
Python에서 파일을 읽거나 쓸 때 한글이 깨지는 가장 흔한 원인은 open() 함수에 인코딩을 명시하지 않아서 운영체제의 기본 인코딩이 적용되는 경우입니다. 이 문제는 다음과 같이 encoding='utf-8' 옵션을 명시적으로 지정해주는 것만으로 대부분 해결됩니다.
with open('sample.txt', 'r', encoding='utf-8') as f:
content = f.read()
print(content)
파일을 쓸 때도 마찬가지로 인코딩을 지정해주는 것이 안전합니다.
with open('output.txt', 'w', encoding='utf-8') as f:
f.write('안녕하세요, 파이썬입니다.')
UnicodeDecodeError 대응하기
기존에 다른 프로그램에서 만들어진 파일을 열었을 때 UnicodeDecodeError가 발생한다면, 그 파일이 UTF-8이 아닌 다른 인코딩(주로 CP949)으로 저장되어 있을 가능성이 큽니다. 이럴 때는 인코딩 값을 바꿔서 다시 시도해볼 수 있습니다.
with open('legacy_file.txt', 'r', encoding='cp949') as f:
content = f.read()
print(content)
파일의 정확한 인코딩을 알 수 없는 경우에는 chardet이라는 외부 라이브러리를 활용해서 인코딩을 자동으로 추측해볼 수도 있습니다.
import chardet
with open('unknown_file.txt', 'rb') as f:
raw_data = f.read()
result = chardet.detect(raw_data)
print(result)
VS Code 터미널에서 발생하는 한글 깨짐 해결하기
터미널 인코딩 설정 확인하기
파일 자체는 문제가 없는데도 VS Code 터미널에 출력되는 한글만 깨져 보인다면, 터미널의 문자 인코딩 설정을 의심해봐야 합니다. 특히 Windows 환경에서는 기본 콘솔이 여전히 CP949를 사용하는 경우가 있어서, Python이 UTF-8로 출력한 문자를 터미널이 다른 방식으로 해석해 깨진 글자로 보여주는 상황이 발생합니다.
이 경우 다음 명령어를 터미널에서 먼저 실행해 콘솔의 문자 코드 페이지를 UTF-8로 변경할 수 있습니다.
chcp 65001
환경변수로 근본적인 해결하기
매번 터미널을 열 때마다 코드 페이지를 변경하는 것이 번거롭다면, PYTHONIOENCODING이라는 환경변수를 설정해서 Python이 표준 입출력을 항상 UTF-8로 처리하도록 만들 수 있습니다.
- Windows 검색창에 "환경 변수 편집"을 입력해 실행합니다
- 사용자 변수에 새 변수를 추가합니다
변수 이름: PYTHONIOENCODING
변수 값: utf-8
이렇게 설정해두면 터미널을 새로 열 때마다 코드 페이지를 바꿔줄 필요 없이, Python이 항상 UTF-8 기준으로 문자를 출력하게 됩니다.
소스 코드 파일 자체의 인코딩 확인하기
VS Code에서 파일 인코딩 확인 및 변경
가끔은 소스 코드 파일 자체가 UTF-8이 아닌 다른 인코딩으로 저장되어 있어서 한글 주석이나 문자열이 깨져 보이는 경우가 있습니다. VS Code 하단 상태바에는 현재 열려 있는 파일의 인코딩이 표시되는데, 이 부분을 클릭하면 인코딩을 확인하고 변경할 수 있습니다.
파일을 "인코딩을 사용하여 다시 열기"로 CP949 등을 시도해서 글자가 정상적으로 보이는지 확인한 다음, "인코딩을 사용하여 저장"으로 UTF-8을 선택해서 저장해두면 이후로는 동일한 문제가 반복되지 않습니다.
마무리
지금까지 VS Code에서 Python을 사용할 때 발생하는 한글 깨짐 문제의 원인과 해결 방법을 정리해봤습니다. 인코딩 문제는 원인이 눈에 잘 보이지 않아 처음에는 막막하게 느껴지지만, 파일 입출력, 터미널 설정, 소스 코드 파일 자체라는 세 가지 지점을 순서대로 점검하면 대부분 해결할 수 있습니다.
핵심 내용을 정리하면 다음과 같습니다.
- 인코딩은 문자를 숫자로 변환하는 규칙이며, 저장과 읽기 방식이 다르면 글자가 깨집니다
- 파일을 열거나 쓸 때는
encoding='utf-8'을 명시하는 습관이 중요합니다 - Windows 터미널에서는
chcp 65001명령어로 코드 페이지를 UTF-8로 바꿀 수 있습니다 PYTHONIOENCODING환경변수를 설정하면 매번 코드 페이지를 바꾸지 않아도 됩니다- VS Code 하단 상태바에서 소스 코드 파일 자체의 인코딩을 확인하고 변경할 수 있습니다
다음 글에서는 Python에서 CSV나 엑셀 파일을 다룰 때 발생하는 한글 인코딩 문제를 좀 더 심도 있게 다뤄보도록 하겠습니다.
댓글
댓글 쓰기