본문 바로가기
Q&A해결2026년 8월 4일1분 읽기

파이썬으로 만든 CSV를 엑셀에서 열면 한글이 다 깨지는데 인코딩 문제일까요

e
encoding_minji
조회 704댓글 2

서버에서 pandas로 df.to_csv 로 저장한 CSV를 사용자가 받아서 엑셀(윈도우, 한국어)에서 열면 한글이 김순 이런 식으로 다 깨져 보인다고 합니다. 메모장이나 vscode로 열면 멀쩡하게 한글이 나오고요.

파일은 UTF-8로 저장하고 있습니다. 분명 utf-8이 맞는데 엑셀에서만 깨지는 게 이상해서요.

df.to_csv("report.csv", index=False, encoding="utf-8")

encoding을 cp949로 바꾸면 엑셀에선 되는데 이번엔 리눅스에서 cat 하면 깨지고, 이모지나 특수문자가 든 셀에서 에러가 납니다. 양쪽 다 잘 되게 하는 방법은 없을까요?

댓글 2

김김영삼2개월 전
엑셀(특히 한국어 윈도우판)이 문제입니다. 엑셀은 CSV를 열 때 파일 맨 앞에 BOM이 없으면 UTF-8이라고 판단을 안 하고 시스템 기본 코드페이지(한국어면 cp949)로 읽어버립니다. 그래서 실제로는 멀쩡한 UTF-8인데 엑셀이 cp949로 오해해서 한글이 깨지는 거예요. 메모장이나 vscode는 UTF-8을 잘 감지하니 멀쩡했던 거고요.

해결은 cp949로 바꾸는 게 아니라(그럼 이모지에서 터지고 리눅스에서 깨집니다) UTF-8 그대로 두되 맨 앞에 BOM을 붙이는 겁니다. pandas면 encoding을 utf-8 대신 utf-8-sig 로 하세요.

df.to_csv('report.csv', index=False, encoding='utf-8-sig')

utf-8-sig는 파일 맨 앞에 BOM 3바이트를 붙여줘서 엑셀이 이걸 보고 'UTF-8이구나' 하고 제대로 읽습니다. 내용 자체는 여전히 UTF-8이라 리눅스 cat이나 다른 프로그램에서도 문제없고 이모지도 그대로 살아요. 양쪽 다 되는 게 이 방법입니다.

한 가지만 주의하세요. BOM에 민감한 일부 파서는 맨 앞 컬럼 헤더에 보이지 않는 BOM이 붙어서 'id'가 아니라 '\ufeffid'로 읽혀 키 매칭에 실패할 수 있습니다. 이 CSV를 나중에 프로그램으로 다시 읽을 거면 읽는 쪽도 utf-8-sig로 읽으면 BOM을 알아서 떼줍니다. 사람이 엑셀로 볼 용도면 utf-8-sig가 정답이에요.
eencoding_minji(guest)2개월 전
utf-8-sig 하나로 엑셀도 되고 리눅스도 되네요. cp949로 왔다갔다 하면서 삽질했는데 BOM 얘기 듣고 딱 이해됐습니다. 감사합니다!
Ctrl+Enter로 등록