압축 파일을 풀면 한글 파일 이름이 깨질 때(zip 한글 깨짐) 해결법
압축 파일(zip)을 풀었더니 파일 이름이 ╚╕└╟╖╧나 Ω▓¼∞áü 같은 글자로 나오는 것은 파일 내용이 아니라 파일 이름의 글자 저장 방식을 푸는 프로그램이 잘못 짐작했기 때문입니다. 내용은 멀쩡하니 압축 파일을 지우지 말고, 이름을 해석할 방식을 바꿔서 다시 풀면 됩니다. 압축 프로그램에 '파일 이름 인코딩'(또는 '문자 집합', '코드 페이지') 항목이 있으면 한국어(949, cp949)와 UTF-8을 차례로 골라 보세요. 그런 항목이 없거나 어디 있는지 모르겠다면 아래의 파이썬 스크립트가 두 방식을 알아서 시험합니다.
확인한 환경
OS: Windows-11-10.0.26200-SP0 (한국어)
Python: 3.14.7
Windows에 들어 있는 tar.exe(bsdtar 3.8.9), PowerShell 5.1의 Expand-Archive
이 글의 실행 결과는 모두 위 PC에서 직접 돌린 것입니다. 파이썬과 Windows 기본 도구로 푼 결과를 실었습니다.
먼저 어느 쪽인지 알아보기
zip은 파일 이름을 저장할 때 어떤 글자 방식으로 썼는지 적어 두는 칸이 하나뿐입니다. zip 규격서(PKWARE APPNOTE 6.3.10)에는 이 칸이 일반 용도 비트 11번이고, 켜져 있으면 이름이 UTF-8이라고 되어 있습니다. 이 규격서는 이름 글자표의 원래 기본값을 IBM Code Page 437(영어권 글자표)이라고 적고 있습니다. 즉 칸이 꺼져 있으면 이름이 어떤 방식인지 파일만 봐서는 알 수 없습니다. 한국어 윈도우에서 만든 옛 방식 zip은 이 칸을 끄고 이름을 cp949(한국어 윈도우의 기본 글자표)로 저장합니다. 칸이 꺼진 zip을 받은 프로그램이 영어권 방식으로 읽으면 한글이 깨집니다.
- 이름이
╚╕└╟╖╧처럼 선과 기호가 섞인 글자로 나온다: cp949로 저장된 이름을 영어권 방식으로 읽은 경우 - 이름이
Ω▓¼∞áü나φÜî∞¥ÿ처럼 그리스 문자와 기호가 섞인다: UTF-8로 저장된 이름을 영어권 방식으로 읽은 경우
(글자 모양은 프로그램마다 조금 다를 수 있습니다. 위 두 모양은 파이썬이 영어권 방식으로 읽었을 때의 결과입니다.)
깨지는 zip을 직접 만들어 확인했습니다
한글 이름 파일 두 개와 영문 이름 파일 하나를 넣은 zip을 세 가지로 만들었습니다.
names_cp949.zip 이름 = cp949 바이트, UTF-8 표시 꺼짐
names_utf8.zip 이름 = UTF-8 바이트, UTF-8 표시 켜짐 (정상 표준 방식)
names_utf8_noflag.zip 이름 = UTF-8 바이트, UTF-8 표시 꺼짐
저장된 이름 바이트와 표시 상태입니다. 첫 파일 견적서_2026.txt의 앞부분입니다.
names_cp949.zip: UTF-8 표시(비트 11)=꺼짐 이름 바이트 앞부분=b0 df c0 fb bc ad 5f 32 30 32 36
names_utf8.zip: UTF-8 표시(비트 11)=켜짐 이름 바이트 앞부분=ea b2 ac ec a0 81 ec 84 9c 5f 32
names_utf8_noflag.zip: UTF-8 표시(비트 11)=꺼짐 이름 바이트 앞부분=ea b2 ac ec a0 81 ec 84 9c 5f 32
견적서가 cp949에서는 b0 df c0 fb bc ad, UTF-8에서는 ea b2 ac ec a0 81 ec 84 9c입니다. 같은 글자인데 저장 방식에 따라 바이트가 다르고, 세 번째 zip처럼 UTF-8 바이트인데 표시가 꺼져 있으면 읽는 쪽이 방식을 짐작해야 합니다.
기본 설정으로 풀면 이렇게 됩니다
파이썬 기본 설정(zipfile)으로 이름을 읽은 결과입니다.
[cp949 zip]
'░▀└√╝¡_2026.txt'
'╚╕└╟╖╧/10┐∙ ╚╕└╟.txt'
'readme.txt'
[UTF-8 표시 없는 UTF-8 zip]
'견적서_2026.txt'
'회의록/10월 회의.txt'
'readme.txt'
영문 이름 readme.txt는 어느 쪽이든 멀쩡하고, 한글 이름만 깨집니다. names_utf8.zip(표시가 켜진 정상 zip)은 기본 설정으로도 한글이 정상이었습니다. 실제로 풀어서 폴더를 보면 깨진 이름 그대로 파일이 생깁니다.
readme.txt
╚╕└╟╖╧/10┐∙ ╚╕└╟.txt
░▀└√╝¡_2026.txt
Windows 기본 도구는 어땠나
이 PC에서 Windows에 들어 있는 tar.exe(명령 프롬프트에서 tar -xf 파일.zip), PowerShell의 Expand-Archive, 그리고 탐색기가 압축 폴더를 열 때 쓰는 부품(Shell.Application)을 PowerShell에서 불러 같은 세 zip을 풀어 봤습니다.
| zip | tar.exe | Expand-Archive | 압축 폴더 부품 |
|---|---|---|---|
| cp949 이름 | 한글 이름 정상 | 한글 이름 정상 | 한글 이름 정상 |
| UTF-8 표시 켜짐 | 한글 이름 정상 | 한글 이름 정상 | 한글 이름 정상 |
| UTF-8 바이트, 표시 꺼짐 | 한글 파일 2개 실패 | 오류로 중단 | 오류 없이 readme.txt만 생김 |
세 번째 경우의 실제 출력입니다.
tar.exe utf8_noflag (종료 코드 1)
견적서_2026.txt: Invalid empty pathname: Unknown error
회의록/10월 회의.txt: Invalid empty pathname: Unknown error
tar.exe: Error exit delayed from previous errors
→ 결과 폴더에는 readme.txt만 생김
Expand-Archive utf8_noflag
New-Object : Exception calling ".ctor" with "1" argument(s): "Illegal characters in path."
압축 폴더 부품은 세 번째 zip에서 오류 없이 영문 파일 하나만 만들었습니다. 압축을 풀었는데 파일 수가 줄어 있다면 이 경우일 수 있습니다.
이 PC는 한국어 윈도우라서 cp949 이름 zip은 잘 풀렸습니다. 한글 윈도우가 한국어 글자표를 기본으로 쓰기 때문이라고 보입니다. 윈도우 언어 설정이 다른 PC에서는 결과가 다를 수 있습니다. 반대로 한국어 윈도우에서도 UTF-8 이름인데 표시가 꺼진 zip은 이 세 도구가 제대로 풀지 못했습니다.
해결: 이름 해석 방식을 지정해서 풀기
한국어 윈도우에서 만든 zip을 다른 곳에서 열었다면 cp949, UTF-8 이름인데 표시가 없다면 UTF-8로 해석하면 됩니다. 파이썬 3.14.7에서는 zip을 열 때 metadata_encoding으로 지정할 수 있습니다(zipfile 공식 문서).
import zipfile
with zipfile.ZipFile("파일.zip", metadata_encoding="cp949") as z:
z.extractall("풀_폴더")
cp949 zip은 cp949로, UTF-8 이름이면 utf-8로 읽었을 때 이름이 정상이었습니다.
[cp949 zip, metadata_encoding='cp949'] '견적서_2026.txt' '회의록/10월 회의.txt'
[UTF-8 표시 없음, metadata_encoding='utf-8'] '견적서_2026.txt' '회의록/10월 회의.txt'
코드를 모르는 분용 스크립트
방식을 일일이 고르기 번거로워 UTF-8, cp949 순서로 시험하는 스크립트를 만들었습니다. 아래 내용을 메모장에 붙여 unzip_korean.py로 저장(인코딩은 UTF-8)하고 파이썬이 설치된 PC에서 실행합니다.
import sys, zipfile
from pathlib import Path
src, dst = sys.argv[1], Path(sys.argv[2])
candidates = [sys.argv[3]] if len(sys.argv) > 3 else ["utf-8", "cp949"]
for enc in candidates:
try:
z = zipfile.ZipFile(src, metadata_encoding=enc)
except UnicodeDecodeError:
print(f"{enc}: 이름을 해석하지 못함")
continue
with z:
z.extractall(dst)
print(f"{enc}로 풀었음")
for n in z.namelist():
print(" ", n)
break
else:
sys.exit("어느 인코딩으로도 풀지 못했습니다")
python unzip_korean.py 파일.zip 풀_폴더
세 zip에 모두 돌린 결과입니다. 이름이 정상이고 3개 파일이 모두 풀렸습니다.
-- unzip_korean.py cp949
utf-8: 이름을 해석하지 못함
cp949로 풀었음
견적서_2026.txt
회의록/10월 회의.txt
readme.txt
-- unzip_korean.py utf8_noflag
utf-8로 풀었음
견적서_2026.txt
회의록/10월 회의.txt
readme.txt
utf8(표시가 켜진 zip)도 utf-8로 풀었음과 정상 이름이었습니다.
잘못 짐작했을 때
방식을 직접 적을 수도 있습니다. cp949 zip에 utf-8을 적으면 풀리지 않고 이렇게 멈춥니다.
python unzip_korean.py names_cp949.zip 폴더 utf-8
utf-8: 이름을 해석하지 못함
어느 인코딩으로도 풀지 못했습니다
cp949를 적으면 정상으로 풀립니다. 이 스크립트는 UTF-8을 먼저 시험하므로, 풀린 이름이 이상하면 세 번째 칸에 cp949를 직접 적어 다시 풀어 보세요. 짧은 이름이면 두 방식 모두 해석되어 엉뚱한 글자가 나올 수 있기 때문입니다(이 부분은 위 세 zip으로는 겪지 않았고, 글자표의 성질에서 나온 주의입니다).
압축 프로그램을 쓸 때
시중의 압축 프로그램은 프로그램 도움말이나 설정에서 파일 이름 인코딩, 문자 집합, 코드 페이지로 찾아 보세요. 항목이 있으면 한국어(949) 또는 UTF-8을 고르면 되고, 원리는 위와 같습니다.
정리
- 한글 이름이 깨진 것은 이름의 저장 방식(cp949 또는 UTF-8)을 프로그램이 잘못 짐작해서입니다. 파일 내용은 그대로입니다.
- 방식을 지정해서 다시 풀면 됩니다. 한국어 윈도우에서 만든 옛 zip은 cp949, 그 밖에는 UTF-8을 먼저 시험합니다.
- 압축 파일을 보내는 쪽은 한글 이름이 걱정되면 파일 이름을 영문·숫자로 바꾸거나 UTF-8 표시를 켜는 방식으로 압축하는 도구를 쓰면 이 문제를 피할 수 있습니다. (UTF-8 표시가 켜진 zip은 이 PC의 Windows 기본 도구 두 가지와 파이썬 모두 정상이었습니다.)