동료에게 받은 CSV를 웹 업로드 양식에 올렸더니 "UTF-8로 저장해서 다시 올려 주세요"라는 안내가 떴습니다. 분명 엑셀에서 멀쩡히 열리던 파일인데, 시스템이 요구하는 인코딩이 따로 있는 상황입니다.
이럴 때 필요한 건 한 가지입니다. 파일을 UTF-8로 다시 저장하는 것. 도구마다 방법이 조금씩 다르고, 같은 UTF-8이라도 두 종류가 있어 헷갈리기 쉽습니다. 메모장, 엑셀, 파이썬 순으로 가장 빠른 길을 정리하고, 두 종류의 UTF-8 차이를 실제 바이트로 확인해 보겠습니다.
먼저 알아둘 것: UTF-8은 사실 두 종류입니다
저장 옵션에서 흔히 보이는 이름이 UTF-8과 UTF-8 (BOM 포함)입니다. 둘의 실제 내용은 거의 같고, 차이는 파일 맨 앞에 붙는 3바이트짜리 표식 하나뿐입니다. 이 표식을 BOM이라고 부릅니다.
BOM은 "이 파일은 UTF-8입니다"라고 알려 주는 꼬리표입니다. 윈도우용 엑셀은 이 꼬리표가 있으면 한글을 바로 알아보고, 없으면 옛 방식(CP949)으로 착각해 한글이 깨질 수 있습니다. 그래서 엑셀로 열 파일이면 BOM 포함 쪽이, 웹 서버나 개발 도구로만 다룰 파일이면 BOM 없는 쪽이 보통 잘 맞습니다.
1. 메모장으로 저장하기 (설치 없이 가장 빠름)
파일 크기가 작고 윈도우만 쓴다면 메모장이 제일 간단합니다.
1) CSV 파일을 메모장으로 엽니다. (파일을 우클릭하고 연결 프로그램에서 메모장을 고릅니다.)
2) 상단 메뉴에서 [파일] 다음 [다른 이름으로 저장]을 누릅니다.
3) 저장 창 아래쪽 인코딩 선택란에서 UTF-8을 고릅니다. 엑셀 호환을 원하면 UTF-8 (BOM)이 있을 경우 그쪽을 고릅니다.
4) 파일 형식을 "모든 파일"로 두고 이름 끝을 .csv로 유지한 채 저장합니다.
최신 윈도우 11 메모장은 인코딩 항목에 "UTF-8"과 "UTF-8 (BOM)"이 나뉘어 있습니다. 버전에 따라 표기가 다를 수 있으니, 둘 중 하나만 보이면 그것으로 저장하면 됩니다.
2. 엑셀에서 CSV UTF-8로 저장하기
엑셀에서 데이터를 편집한 뒤 UTF-8 CSV로 내보내는 경우입니다.
1) [파일] 다음 [다른 이름으로 저장] 또는 [복사본 저장]을 누릅니다.
2) 파일 형식 목록에서 CSV UTF-8(쉼표로 분리)(*.csv)를 선택합니다.
3) 위치와 이름을 정하고 저장합니다.
이 형식은 마이크로소프트 365와 최근 엑셀 버전에 들어 있고, BOM이 포함된 UTF-8로 저장됩니다. 그래서 같은 엑셀에서 다시 열어도 한글이 안 깨집니다. 목록에 이 항목이 없는 구버전이라면, 위의 메모장 방법으로 다시 저장하거나 아래 파이썬 방법을 쓰면 됩니다.
3. 파이썬으로 저장하기 (양이 많거나 자동화할 때)
파일이 많거나 반복 작업이라면 파이썬이 확실합니다. 인코딩 이름만 바꾸면 됩니다. BOM을 붙이려면 utf-8-sig, 안 붙이려면 utf-8로 지정합니다. 둘 다 표준 라이브러리만 쓰며 별도 설치가 없습니다.
import csv
rows = [["이름", "도시"], ["김민수", "서울"], ["이서연", "부산"]]
# 엑셀 호환용: BOM 포함 UTF-8
with open("for_excel.csv", "w", encoding="utf-8-sig", newline="") as f:
csv.writer(f).writerows(rows)
# 웹/개발용: BOM 없는 UTF-8
with open("for_web.csv", "w", encoding="utf-8", newline="") as f:
csv.writer(f).writerows(rows)
이미 CP949(ANSI)로 저장된 파일을 UTF-8로 바꾸려면, 원래 인코딩으로 읽어서 새 인코딩으로 다시 쓰면 됩니다.
with open("old_cp949.csv", encoding="cp949") as src:
text = src.read()
with open("new_utf8.csv", "w", encoding="utf-8-sig") as dst:
dst.write(text)
저장 방식별로 앞부분 바이트를 직접 꺼내 봤습니다
같은 표 데이터(첫 줄이 "이름,도시")를 세 가지 인코딩으로 저장한 뒤, 파일 맨 앞 6바이트를 16진수로 꺼내고 크기를 쟀습니다. 측정 환경은 윈도우 11, 파이썬 3.14.3 표준 라이브러리 csv입니다.
| 저장 인코딩 | 파일 크기 | 맨 앞 바이트(16진) | BOM 표식 |
|---|---|---|---|
| utf-8 | 69 byte | EC 9D B4 EB A6 84 | 없음 |
| utf-8-sig | 72 byte | EF BB BF EC 9D B4 | EF BB BF |
| cp949 | 50 byte | C0 CC B8 A7 2C B5 | 없음 |
utf-8-sig로 저장한 파일만 맨 앞에 EF BB BF 세 바이트가 더 붙어 있습니다. 이것이 BOM입니다. 그 뒤로 이어지는 EC 9D B4는 한글 '이'를 UTF-8로 적은 값으로, BOM 없는 utf-8 파일의 첫 바이트와 정확히 같습니다. 두 UTF-8 파일의 내용은 동일하고, 차이는 오직 앞 3바이트 표식뿐입니다.
크기 차이도 딱 3바이트(69 대 72)입니다. CP949가 50바이트로 가장 작은 건 한글을 글자당 2바이트로 적기 때문인데, 대신 한국어 윈도우 밖에서는 다시 깨질 위험이 있어 호환성은 UTF-8 쪽이 넓습니다.
다시 열어도 내용은 그대로일까
세 파일을 각자의 인코딩으로 다시 읽어 첫 데이터 행을 출력했더니 모두 같은 값이 나왔습니다.
utf-8 -> ['김민수', '서울']
utf-8-sig -> ['김민수', '서울']
cp949 -> ['김민수', '서울']
즉 인코딩을 바꿔도 글자 자체는 손상되지 않습니다. 한 가지 주의할 점은, utf-8-sig로 저장한 파일을 BOM을 모르는 도구가 그냥 utf-8로 읽으면 첫 셀 앞에 보이지 않는 문자()가 따라붙는다는 것입니다. 그래서 받는 쪽이 BOM을 싫어하는 시스템이면 BOM 없는 utf-8로 저장하는 편이 안전합니다.
그래서 둘 중 무엇으로 저장할까
| 이럴 때 | 이 인코딩 |
|---|---|
| 엑셀로 더블클릭해서 열 일이 많다 | UTF-8 (BOM), 파이썬은 utf-8-sig |
| 웹 업로드, API, 깃 저장소에 넣는다 | BOM 없는 UTF-8, 파이썬은 utf-8 |
| 받는 사람 환경을 모르겠다 | 요청에 "UTF-8"만 있으면 BOM 없는 쪽부터 |
엑셀 호환이 목적이면 BOM 포함, 웹과 개발 도구가 목적이면 BOM 없는 UTF-8을 고르면 됩니다.
인코딩은 한번 손에 익으면 파일 종류를 가리지 않습니다. CSV에서 UTF-8 저장이 익숙해졌다면, 같은 원리가 적용되는 TSV나 일반 텍스트(TXT) 파일, 그리고 처음부터 UTF-8을 전제로 쓰는 JSON 형식도 같은 감각으로 다룰 수 있습니다.




'파일 형식 백과사전' 카테고리의 다른 글
| CSV를 Parquet로 변환하기, 특별한 프로그램 없이 pandas 한 줄이면 됩니다 (1) | 2026.07.04 |
|---|---|
| 같은 데이터를 CSV와 Parquet로 저장하면 용량과 읽기 속도가 얼마나 차이 날까 (0) | 2026.07.03 |
| JSON 한 줄 저장과 들여쓰기 저장, 용량이 얼마나 차이 날까 (실측과 정리 방법) (0) | 2026.06.30 |
| 아이폰 사진 수백 장이 HEIC일 때, PC에서 한 번에 JPG로 바꾸는 법 (0) | 2026.06.29 |
| 사진만 보내면 위치는 안 새어 나간다? 사진 속 EXIF 확인하고 지우는 법 (1) | 2026.06.29 |