CSV 도우미English

CSV 한글 깨짐 해결 가이드|엑셀에서 열 때 확인할 순서

CSV 한글 깨짐 해결이 필요하다면 엑셀에서 열 때 인코딩을 잘못 읽은 것인지, 이미 글자가 바뀐 채 저장된 것인지 먼저 나누세요. 원본을 덮어쓰지 말고 올바른 인코딩으로 읽은 사본과 비교합니다.

30초 해결 순서

  1. 원본을 따로 보관하세요. 깨져 보이는 파일을 원본 위에 저장하지 않습니다.
  2. 잘못 읽은 경우: 원본이 UTF-8인지 CP949인지 확인하고, 맞는 인코딩으로 다시 읽어 미리보기를 확인합니다. 엑셀에서 열 때는 데이터의 텍스트/CSV 가져오기 경로를 확인하세요. 메뉴는 Excel 버전과 운영체제에 따라 다를 수 있습니다.
  3. 이미 손실된 경우: 글자가 다른 문자로 바뀐 채 저장되거나 빠졌다면 인코딩 변환·BOM 추가만으로 복구를 보장할 수 없습니다. 변경 전 원본이나 제공처의 재내보내기 파일을 확보하세요.
  4. 정상으로 보이면: 한글·열·코드 값을 확인한 뒤 필요한 형식의 새 사본으로 저장합니다. 엑셀용 사본은 UTF-8(BOM)을 선택할 수 있으며, 다른 시스템에 보낼 때는 수신 규격을 먼저 확인하세요.

원인

CSV는 표의 값을 담는 텍스트 파일입니다. 같은 바이트도 어떤 인코딩으로 읽는지에 따라 다른 글자가 됩니다. UTF-8이라는 정보를 여는 프로그램이 올바르게 사용하지 않으면 표시가 달라질 수 있습니다. 모든 한글 깨짐이 같은 원인은 아닙니다.

Microsoft는 UTF-8 CSV에 BOM이 있으면 Excel에서 정상적으로 여는 경로를 안내하며, BOM이 없는 파일은 데이터를 가져오는 방법을 설명합니다. 실제 동작과 메뉴는 Excel 버전·운영체제·가져오기 방식에 따라 확인해야 합니다. Microsoft 공식 안내

재현: 같은 파일을 다른 인코딩으로 읽기

첨부 예제 01-utf8-no-bom.csv는 가상 상품 두 개만 담은 UTF-8 파일입니다.

item,count
가상상품,2
연습자료,3

아래는 파일이 정상이어도 잘못된 디코딩 때문에 표시가 달라지는지 확인하는 최소 예제입니다. Python 3에서 실행하며 파일 경로는 예제 폴더 기준입니다.

from pathlib import Path
raw = Path('01-utf8-no-bom.csv').read_bytes()
correct = raw.decode('utf-8')
wrong = raw.decode('latin-1')
assert '가상상품' in correct
assert '가상상품' not in wrong

latin-1은 불일치를 명확히 보여주기 위해 일부러 골랐습니다. Excel이 실제로 이 인코딩을 골랐다고 재현한 것은 아닙니다. 이번 검증은 로컬 Python에서 수행했으며 Excel 화면은 실행하지 않았습니다.

해결 1: 원본을 바꾸지 않고 가져오기

Excel의 데이터 가져오기에서 텍스트/CSV 파일을 선택하고 UTF-8 인코딩을 지정합니다. 미리보기에서 가상상품, 연습자료가 보이는지, 열이 item과 count로 나뉘는지 확인한 뒤 불러옵니다. 해당 메뉴가 없는 버전은 공식 안내의 텍스트 가져오기 경로를 확인하세요.

이 방법은 파일 자체를 변환하지 않아도 됩니다. 코드·주문번호 같은 열이 있다면 별도로 텍스트 유형을 지정해야 합니다. UTF-8 설정은 앞자리 0 손실을 해결하는 설정이 아닙니다.

해결 2: 필요하면 BOM이 있는 사본 만들기

원본이 UTF-8임을 알고 있고 받는 프로그램에 BOM이 필요한 경우에만 새 파일로 만듭니다.

from pathlib import Path
source = Path('01-utf8-no-bom.csv')
copy = Path('01-utf8-with-bom.csv')
copy.write_bytes(b'\xef\xbb\xbf' + source.read_bytes())

이 짧은 코드는 BOM 없는 예제 전용입니다. 이미 BOM이 있는 파일에 다시 실행하면 중복 BOM이 생길 수 있습니다. 다른 인코딩의 파일 앞에 BOM만 붙여도 UTF-8로 변환되지는 않습니다. 일반 작업에서는 인코딩을 확인한 뒤 읽고, 새 파일에 utf-8-sig로 쓰는 경로를 사용하세요. Python 공식 codecs 문서

제공한 BOM 사본은 선두 바이트 EF BB BF를 확인했습니다. 두 파일을 올바르게 읽고 CSV로 파싱한 결과는 헤더 1개·데이터 2개로 서로 같았습니다. 재현 스크립트는 CSV를 다시 쓰므로 원본 바이트 전체가 동일하다는 검증은 아닙니다.

한계와 다음 확인

파일 자체가 이미 ?나 대체 문자로 저장됐다면 BOM을 추가해도 사라진 글자는 되살아나지 않습니다. 그때는 원본이나 내보내기 설정을 다시 확보해야 합니다. UTF-8이 아닌 파일을 추측해서 일괄 변환하지 말고 출처의 인코딩 정보를 확인하세요. 다른 프로그램에 전달할 때는 상대가 BOM을 지원하는지도 확인합니다.

검토일: 2026-10-18. 로컬 재현: Python 3.9.6, 합성 데이터. Excel GUI 동작 검증은 미실행이며 게시 전 대상 버전에서 가져오기 화면 확인이 남아 있습니다.

AI 보조 작성: AI로 초안을 작성하고 합성 예제를 생성했습니다. 코드 실행 결과와 공식 문서를 대조했으며, 사람의 실제 Excel 사용 경험을 대신 주장하지 않습니다.

이 글의 예제 파일을 CSV 검사기에 넣어 직접 확인해 보세요.

인코딩 변환 (CP949 ↔ UTF-8) 열기 ›