CSV 한글 깨짐, 왜 생기고 어떻게 해결하나
엑셀에서 CSV를 열었을 때 한글이 二쇰Ц踰�� 처럼 보이는 문제의 원인, 증상별 진단법, 그리고 다시는 재발하지 않게 만드는 해결책을 정리했습니다.
한 줄 요약
한글이 깨지는 이유는 파일이 손상됐기 때문이 아니라, 엑셀이 글자를 저장한 규칙과 다른 규칙으로 읽기 때문입니다. 대부분의 CSV는 UTF-8로 저장되는데 한국어 Windows의 엑셀은 이를 EUC-KR(CP949)로 읽습니다. CSV를 XLSX로 변환하면 인코딩 정보가 파일 안에 포함되므로 이 문제가 영구히 사라집니다.
1. 왜 엑셀에서 CSV를 열면 한글이 깨질까?
컴퓨터는 글자를 그대로 저장하지 않고 숫자(바이트)로 바꿔 저장합니다. 이때 "어떤 글자를 어떤 숫자로 바꿀지" 정한 약속을 문자 인코딩이라고 합니다. 문제는 CSV 파일 안에 "나는 어떤 인코딩으로 저장됐다"는 표시가 들어갈 자리가 없다는 점입니다. 그래서 프로그램이 파일을 열 때 인코딩을 추측하고, 그 추측이 틀리면 글자가 깨집니다.
CSV에는 인코딩 표시가 없다
CSV는 쉼표로 구분된 순수 텍스트일 뿐이라, 인코딩 정보를 담을 헤더가 존재하지 않습니다.
엑셀은 시스템 기본값으로 추측한다
한국어 Windows에서 엑셀이 CSV를 더블 클릭으로 열면 UTF-8이 아닌 CP949로 해석합니다.
요즘 시스템은 전부 UTF-8로 만든다
쇼핑몰 관리자, 구글 시트, 데이터베이스, API는 모두 UTF-8로 CSV를 내보냅니다. 충돌은 필연입니다.
2. 증상별 진단: 깨진 모양만 봐도 원인을 알 수 있다
깨진 글자의 생김새가 곧 단서입니다. 아래 표에서 화면에 보이는 모양을 찾으면 어떤 인코딩이 어긋났는지 바로 알 수 있습니다.
| 화면에 보이는 모양 | 예시 | 실제 원인 | 해결 |
|---|---|---|---|
| 알 수 없는 한자·기호가 섞임 | 二쇰Ц踰�� | UTF-8 파일을 CP949로 읽음 (가장 흔함) | XLSX 변환 또는 BOM 추가 |
| ì, ë, í 같은 라틴 문자 | 주문번호 | UTF-8 파일을 서유럽(Latin-1)으로 읽음 | XLSX 변환 |
| 마름모 물음표 � 가 연속 | ���� | CP949 파일을 UTF-8로 읽음 (반대 방향) | 인코딩을 EUC-KR로 지정 후 변환 |
| 글자 사이에 빈칸·네모가 낌 | 한 글 | UTF-16 파일을 8비트 인코딩으로 읽음 | 인코딩을 UTF-16LE로 지정 |
| 한글은 멀쩡한데 전부 한 칸에 들어감 | 홍길동,서울,1000 | 인코딩이 아니라 구분자 문제 (쉼표 vs 세미콜론) | 구분자 옵션 변경 |
| 한글은 정상, 010… 이 1.02E+09 로 바뀜 | 1.02E+09 | 깨짐이 아니라 엑셀의 자동 숫자 변환 | XLSX 변환(기본값이 텍스트 보존) |
3. UTF-8, EUC-KR, CP949, UTF-16은 무엇이 다른가
한국에서 CSV를 다룰 때 마주치는 인코딩은 사실상 네 가지입니다. 같은 "한" 한 글자가 각각 몇 바이트로 저장되는지 비교하면 차이가 분명해집니다.
| 인코딩 | "한"의 바이트 | 주 사용처 | 엑셀 더블클릭 시 | 비고 |
|---|---|---|---|---|
| UTF-8 | ED 95 9C (3B) | 웹·API·DB·구글 시트 등 사실상 모든 현대 시스템 | 깨짐 | 전 세계 표준. 모든 언어 표현 가능 |
| UTF-8 with BOM | EF BB BF ED 95 9C | 엑셀 호환을 의식하고 내보낸 CSV | 정상 | 앞 3바이트가 "나는 UTF-8"이라는 서명 역할 |
| EUC-KR / CP949 | C7 D1 (2B) | 관공서 시스템, 구형 ERP, 오래된 사내 프로그램 | 정상 | 한글 전용. CP949는 EUC-KR 확장판(현대 한글 11,172자 지원) |
| UTF-16LE | 5C D5 (2B, BOM 별도) | 일부 공공 포털, SAP, Windows 내부 형식 | 조건부 | BOM이 있으면 대체로 인식, 없으면 깨짐 |
* EUC-KR과 CP949는 실무에서 거의 같은 뜻으로 쓰이지만, 엄밀히는 CP949(=Windows-949)가 EUC-KR을 확장해 현대 한글 11,172자를 모두 담은 상위 집합입니다. 이 변환기는 EUC-KR 선택 시 CP949 영역까지 함께 처리합니다.
4. 해결 방법 세 가지와 각각의 한계
해결책은 크게 세 가지입니다. 결론부터 말하면 XLSX 변환이 유일하게 재발하지 않는 방법입니다.
| 방법 | 소요 시간 | 재발 여부 | 한계 |
|---|---|---|---|
| 추천XLSX로 변환 | 약 5초 | 없음 (영구 해결) | CSV 형식이 반드시 필요한 시스템에는 업로드 불가 |
| UTF-8 BOM을 붙인 CSV | 약 5초 | 낮음 | BOM 3바이트를 이해하지 못하는 구형 시스템·파서에서는 첫 열 이름이 깨질 수 있음 |
| 엑셀 [데이터 가져오기] 마법사 | 약 1~2분 | 매번 반복 | 파일을 열 때마다 수동 설정. 엑셀 버전마다 메뉴 위치가 달라 공유하기 어려움 |
5. XLSX로 바꾸면 왜 다시는 깨지지 않는가
CSV가 "인코딩을 모르는 맨 텍스트"라면, XLSX는 인코딩이 파일 안에 명시된 구조화 문서입니다. XLSX는 사실 여러 XML 파일을 묶은 ZIP 압축 파일이고, 그 XML 첫 줄에encoding="UTF-8"이 선언되어 있습니다. 엑셀은 추측할 필요 없이 이 선언을 그대로 따릅니다. 추측이 사라지므로 깨질 여지도 사라집니다.
6. 변환기 없이 엑셀에서 직접 여는 방법
도구를 쓸 수 없는 환경이라면 엑셀 기본 기능으로도 해결할 수 있습니다. 다만 파일을 열 때마다 반복해야 합니다.
방법 A. 엑셀 [데이터] 탭으로 가져오기 (권장)
- 1엑셀에서 빈 통합 문서를 새로 연다.
- 2[데이터] 탭 → [텍스트/CSV 가져오기]를 선택한다.
- 3문제의 CSV 파일을 고른다.
- 4미리보기 창의 [원본 파일] 항목에서 "65001: 유니코드(UTF-8)"를 선택한다.
- 5미리보기에서 한글이 정상으로 보이는지 확인하고 [로드]를 누른다.
CSV를 그냥 더블 클릭하면 이 과정을 거치지 않아 다시 깨집니다. 반드시 [가져오기]로 열어야 합니다.
방법 B. 메모장으로 인코딩 바꿔 저장하기
- 1CSV 파일을 Windows 메모장으로 연다.
- 2한글이 정상으로 보이는지 확인한다. (깨져 보이면 이 방법은 쓸 수 없다)
- 3[파일] → [다른 이름으로 저장]을 누른다.
- 4하단 [인코딩] 목록에서 "UTF-8 (BOM)" 또는 "ANSI"를 고른다.
- 5저장한 뒤 엑셀에서 연다.
파일이 수십 MB 이상이면 메모장이 열지 못하거나 매우 느려집니다.
방법 C. 구글 스프레드시트로 우회하기
구글 시트는 UTF-8을 기본으로 처리하므로 CSV를 그대로 업로드해도 깨지지 않습니다. 구글 드라이브에 CSV를 올려 시트로 연 다음, [파일] → [다운로드] → [Microsoft Excel(.xlsx)]로 내려받으면 깨지지 않는 엑셀 파일을 얻을 수 있습니다. 단, 데이터가 구글 서버에 업로드된다는 점은 감안해야 합니다. 사내 기밀·개인정보가 담긴 파일이라면 브라우저 안에서만 처리하는 이 변환기가 더 안전합니다.
7. 애초에 깨지지 않게 내보내는 법 (개발자·실무자용)
CSV를 만드는 쪽에서 UTF-8 BOM을 붙이면 받는 사람이 겪는 문제가 사라집니다. 주요 환경별 방법입니다.
| 환경 | 방법 |
|---|---|
| Python | open(path, 'w', encoding='utf-8-sig', newline='') |
| pandas | df.to_csv(path, encoding='utf-8-sig', index=False) |
| Node.js | fs.writeFileSync(path, '' + csv, 'utf8') |
| PHP | fwrite($fp, "\xEF\xBB\xBF"); // 헤더 출력 전 |
| Java | out.write(''); // OutputStreamWriter(UTF_8) |
| 엑셀에서 저장 | [다른 이름으로 저장] → 파일 형식 "CSV UTF-8(쉼표로 분리)" 선택 |
8. 자주 묻는 질문
Q. CSV 파일이 손상된 건가요?
- 아닙니다. 파일 안의 바이트는 그대로이고, 읽는 규칙만 어긋난 상태입니다. 올바른 인코딩으로 다시 읽으면 원래 글자가 그대로 복원됩니다. 깨진 화면을 그대로 저장하지만 않으면 데이터는 손실되지 않습니다.
Q. 깨진 상태로 저장하면 어떻게 되나요?
- 그때는 실제로 데이터가 손상됩니다. 깨진 글자가 새 바이트로 기록되어 원본 정보가 사라지기 때문입니다. 깨진 파일을 열었다면 저장하지 말고 닫은 뒤, 원본으로 다시 시작해야 합니다.
Q. BOM이 정확히 무엇인가요?
- Byte Order Mark의 줄임말로, 파일 맨 앞에 붙는 EF BB BF 3바이트입니다. 화면에는 보이지 않으며 "이 파일은 UTF-8"이라는 서명 역할을 합니다. 엑셀은 이 서명을 보면 추측을 멈추고 UTF-8로 읽습니다.
Q. EUC-KR과 CP949는 같은 건가요?
- 실무에서는 거의 같은 뜻으로 쓰입니다. 엄밀히는 CP949(Windows-949)가 EUC-KR을 확장해 현대 한글 11,172자를 모두 담은 상위 집합입니다. EUC-KR만으로는 표현되지 않는 "믜, 쏀" 같은 글자가 CP949에서는 표현됩니다.
Q. 업로드한 파일이 서버로 전송되나요?
- 전송되지 않습니다. 이 변환기는 파일 읽기, 인코딩 판별, XLSX 생성까지 모든 과정을 사용자의 브라우저 안에서 실행합니다. 네트워크로 파일 내용이 나가지 않으므로 개인정보나 사내 기밀이 담긴 파일도 안전하게 다룰 수 있습니다.
Q. 전화번호 앞의 0이 사라지는 것도 인코딩 문제인가요?
- 아닙니다. 엑셀이 010-1234와 00123 같은 값을 숫자로 자동 인식하면서 앞자리 0을 지우거나 지수 표기(1.02E+09)로 바꾸는 별개의 문제입니다. 이 변환기는 기본적으로 모든 값을 텍스트로 저장해 원본을 보존하며, 필요할 때만 숫자 변환 옵션을 켤 수 있습니다.
Q. 맥(Mac)에서도 한글이 깨지나요?
- 맥용 엑셀도 CSV를 열 때 같은 문제가 생길 수 있습니다. 다만 맥은 시스템 기본 인코딩이 UTF-8이라 증상이 덜 나타납니다. 반대로 EUC-KR로 저장된 한국 관공서 파일은 맥에서 더 자주 깨집니다.
Q. 구분자가 쉼표가 아니라 세미콜론이면 어떻게 하나요?
- 유럽권 엑셀은 쉼표 대신 세미콜론을 쓰는 경우가 많습니다. 이 변환기는 구분자를 자동으로 감지하며, 결과가 이상하면 구분자 옵션에서 세미콜론, 탭, 파이프로 직접 바꿀 수 있습니다.
Q. 얼마나 큰 파일까지 변환되나요?
- 최대 50MB까지 지원합니다. 브라우저 메모리에서 처리하는 구조이므로 그 이상 크기의 파일은 처리 도중 브라우저가 멈출 수 있어 제한을 두었습니다.
Q. 변환한 XLSX를 다시 CSV로 받을 수 있나요?
- 가능합니다. UTF-8 BOM CSV 다운로드 버튼을 누르면 BOM 서명이 붙은 CSV로 내려받을 수 있습니다. 원본에서 쓰던 구분자는 그대로 유지됩니다. 이 파일은 엑셀에서 더블 클릭해도 한글이 깨지지 않습니다.
9. 용어 정리
- 문자 인코딩 (Character Encoding)
- 글자를 컴퓨터가 저장할 수 있는 숫자(바이트)로 바꾸는 규칙. 저장할 때와 읽을 때 같은 규칙을 써야 글자가 보존된다.
- UTF-8
- 전 세계 문자를 하나의 규칙으로 표현하는 유니코드 인코딩. 한글 한 글자는 3바이트다. 오늘날 웹과 데이터베이스의 사실상 표준.
- BOM (Byte Order Mark)
- 파일 맨 앞에 붙는 보이지 않는 서명 바이트. UTF-8에서는 EF BB BF 3바이트이며, 엑셀이 인코딩을 추측하지 않도록 알려 준다.
- CP949 / Windows-949
- 한국어 Windows의 기본 한글 인코딩. EUC-KR을 확장한 형태이며 한글 한 글자가 2바이트다.
- CSV (Comma-Separated Values)
- 값을 쉼표로 구분해 나열한 순수 텍스트 표 형식. 가볍고 호환성이 높지만 인코딩 정보를 담을 수 없다.
- XLSX (Office Open XML)
- 엑셀 2007 이후의 표준 형식. 여러 XML 문서를 ZIP으로 묶은 구조이며 인코딩이 파일 안에 명시되어 있다.
- 모지바케 (Mojibake)
- 인코딩 불일치로 글자가 알아볼 수 없게 깨지는 현상을 가리키는 용어. 일본어 "文字化け"에서 왔다.
- 구분자 (Delimiter)
- 한 줄 안에서 열을 나누는 문자. 보통 쉼표를 쓰지만 세미콜론, 탭(TSV), 파이프를 쓰기도 한다.
지금 바로 해결하기
설치도 회원가입도 필요 없습니다. CSV 파일을 올리면 인코딩을 자동으로 판별해 XLSX로 바꿔 드립니다. 모든 처리는 브라우저 안에서만 이뤄집니다.