서버에서 pandas로 df.to_csv 로 저장한 CSV를 사용자가 받아서 엑셀(윈도우, 한국어)에서 열면 한글이 김순 이런 식으로 다 깨져 보인다고 합니다. 메모장이나 vscode로 열면 멀쩡하게 한글이 나오고요.
파일은 UTF-8로 저장하고 있습니다. 분명 utf-8이 맞는데 엑셀에서만 깨지는 게 이상해서요.
df.to_csv("report.csv", index=False, encoding="utf-8")encoding을 cp949로 바꾸면 엑셀에선 되는데 이번엔 리눅스에서 cat 하면 깨지고, 이모지나 특수문자가 든 셀에서 에러가 납니다. 양쪽 다 잘 되게 하는 방법은 없을까요?
댓글 2
해결은 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가 정답이에요.