← 전체 글

맥 압축파일 한글 깨짐 없이 윈도우 사용자에게 ZIP 보내는 법

맥 압축파일 한글 깨짐 문제는 대부분 ZIP 자체가 손상된 것이 아닙니다. 맥에서 압축해 카카오톡이나 메일로 보낸 파일을 윈도우 쪽에서 열었더니 김민수_견적서.xlsx가 ㄱㅣㅁㅁㅣㄴㅅㅜ_ㄱㅕㄴㅈㅓㄱㅅㅓ.xlsx처럼 자소분리되어 보이거나, 이름은 멀쩡해 보이는데 엑셀이 "파일을 찾을 수 없습니다"라고 하거나, 정체 모를 __MACOSX 폴더와 ._ 파일이 잔뜩 생겼다는 답장이 오는 상황입니다. 원인은 맥의 두 가지 습관입니다. macOS는 한글·일본어·악센트 문자 파일명을 윈도우가 기대하지 않는 분해형 유니코드(NFD)로 저장하는 경우가 많고, Finder의 "압축" 메뉴는 모든 파일의 ._ 복사본이 든 숨김 폴더 __MACOSX를 끼워 넣습니다. 보내는 쪽에서 할 일은 압축하기 전에 파일명을 조합형(NFC)으로 바꾸고, 맥 메타데이터를 빼고 압축해 주는 도구로 ZIP을 만드는 것입니다. 이 글은 그 순서와, 이미 보내 버린 압축파일을 고치는 방법을 다룹니다.

맥에서 만든 ZIP이 윈도우에서 깨져 보이는 이유

서로 다른 세 가지 현상이 섞여 있어서, 지금 보고 있는 것이 어느 쪽인지 알면 해결이 빨라집니다.

자소분리, 즉 분해형 문자(NFD). macOS는 오래전부터 파일명을 NFD로 기록해 왔습니다. "한"이라는 글자를 하나의 완성형 글자가 아니라 ㅎ, ㅏ, ㄴ이라는 자모 단위로 저장하는 방식입니다. "é"도 "e"와 별도의 결합 악센트로 나뉘어 저장됩니다. 반면 윈도우, 대부분의 웹 서버, 대부분의 윈도우 프로그램은 "한"이 한 글자인 조합형(NFC)을 기대합니다. 윈도우 탐색기가 글자를 그럴듯하게 그려 주는 경우도 있지만 내부적으로는 다른 이름이라서, 화면에는 2026_사업계획서.hwp로 보이는데 매크로나 스크립트, 그룹웨어 링크가 NFC 철자로 찾으면 "파일 없음"이 뜹니다. 한글과 일본어는 더 눈에 띕니다. 한글은 자음·모음이 눈에 보이게 흩어지고, 일본어는 탁점이 가나에서 떨어져 が가 か와 ゛로 갈라집니다.

__MACOSX 폴더와 ._ 파일. Finder에서 우클릭 후 "압축"을 고르면 macOS는 리소스 포크와 Finder 메타데이터를 __MACOSX 폴더 안에 ._파일명 형태로 같이 넣습니다. 윈도우에서는 쓸모가 없습니다. 해롭지는 않지만 파일 개수가 두 배로 보이고, ._ 파일을 깨진 사본으로 오해하는 사람이 생기고, 일부 업로드 양식에서는 걸러지기도 합니다.

정규화가 아니라 인코딩 문제. 파일명이 ì 같은 알 수 없는 기호나 물음표 나열로 나온다면 다른 문제입니다. 윈도우 쪽 압축 해제 도구가 파일명을 잘못된 문자 집합으로 읽은 것입니다. 요즘 윈도우 탐색기와 7-Zip, 반디집은 현재 macOS가 만드는 UTF-8 ZIP 파일명을 제대로 읽으므로, 아주 오래된 압축 프로그램에서 주로 생깁니다. 이 글은 그 문제는 다루지 않고, NFD와 불필요한 폴더 문제만 다룹니다.

맥 압축파일 한글 깨짐 없이 압축하는 순서

반드시 이 순서대로 하세요. 압축한 뒤에 이름을 고치면 압축을 다시 해야 하므로, 정규화가 먼저입니다.

1. 파일명이 실제로 NFD인지 확인

Finder에서는 NFD 여부가 보이지 않습니다. 빠르게 확인하는 방법 두 가지입니다.

  • 터미널을 열고 해당 폴더로 cd한 뒤 다음을 실행합니다. ls | python3 -c "import sys,unicodedata; [print(repr(n)) for n in sys.stdin.read().splitlines() if unicodedata.normalize('NFC', n) != n]" 출력되는 이름이 있으면 그 파일은 NFD입니다.
  • 또는 Finder의 "정보 가져오기" 창에서 파일명을 복사해 FilenameFixer 웹앱의 텍스트 변환 칸에 붙여 넣어 보세요. 변환 결과가 붙여 넣은 것과 다르면 그 이름은 분해형입니다.

영문·숫자만 있는 이름(report_2026.pdf)은 영향을 받지 않습니다. 한글, 탁점·반탁점이 붙은 가나, 악센트가 있는 라틴 문자 같은 글자만 해당됩니다.

2. 파일명을 NFC로 정규화

APFS 드라이브를 쓰는 맥(내장 디스크 기준 macOS 10.13 이후 모든 맥)에서는 이름을 바꾸면 바꾼 형태가 그대로 유지됩니다. 선택지는 다음과 같습니다.

  • 브라우저에서 일괄 변경. FilenameFixer 웹앱에 파일을 끌어다 놓고 변경 전후 목록을 확인한 뒤 바뀐 이름의 파일을 내려받습니다. 처리는 브라우저 안에서만 이루어지고 서버로 업로드되지 않습니다. 거래처에서 받은 한글 문서가 뒤섞인 폴더를 한 번에 정리할 때 가장 수월합니다.
  • 터미널 한 줄. 해당 폴더에서 python3 -c "import os,unicodedata; [os.rename(n, unicodedata.normalize('NFC', n)) for n in os.listdir('.') if unicodedata.normalize('NFC', n) != n]" 를 실행합니다. 현재 폴더의 최상위 항목만 바꾸므로 하위 폴더에서 반복하거나, 익숙하다면 os.walk로 확장하세요.
  • Homebrew 사용자는 convmv를 설치하고 폴더에서 convmv -f utf8 -t utf8 --nfc -r --notest .를 실행하면 됩니다.

주의: HFS+ 볼륨(오래된 맥이나 "Mac OS 확장"으로 포맷한 외장하드·USB)에서는 파일 시스템이 다시 NFD로 되돌리기 때문에 이름을 바꿔도 아무 변화가 없는 것처럼 보입니다. 이 경우에는 아래 "이미 보낸 ZIP 고치기" 부분으로 바로 넘어가세요.

3. __MACOSX 폴더 없이 압축

Finder의 "압축" 메뉴는 항상 메타데이터 폴더를 넣습니다. 대신 다음 중 하나를 쓰세요.

  • 터미널의 zip: zip -r -X 압축파일명.zip 폴더이름. -X 옵션이 확장 속성을 제거합니다. .DS_Store까지 빼고 싶다면 zip -r -X 압축파일명.zip 폴더이름 -x "*.DS_Store"로 실행합니다.
  • 터미널의 ditto: ditto -c -k --norsrc --noextattr 폴더이름 압축파일명.zip. 애플이 제공하는 도구이며 윈도우에서 깔끔하게 열리는 ZIP을 만듭니다.
  • Keka(무료 서드파티 압축 프로그램)는 환경설정에 맥 리소스 포크를 제외하는 옵션이 있으니 압축 전에 켜 두세요.

zip과 ditto 모두 UTF-8 파일명을 올바른 플래그와 함께 기록하므로 요즘 윈도우 탐색기와 7-Zip에서 정상적으로 읽힙니다.

4. 보내기 전에 검증

터미널에서 unzip -l 압축파일명.zip을 실행합니다. 내 파일과 폴더만 보이고 __MACOSX 줄이나 ._ 항목이 없어야 합니다. NFD까지 꼼꼼히 확인하려면 이 목록을 1단계의 Python 검사로 넘겨 보면 됩니다.

이미 보낸 ZIP이거나 드라이브가 HFS+인 경우

압축파일을 이미 보냈거나, HFS+ 볼륨이라 이름 변경이 먹히지 않는 경우가 있습니다. 두 경우 모두 원본 파일을 건드리지 않고 완성된 압축파일 안의 이름만 고칠 수 있습니다.

ZIP 파일명 복원 도구는 200 MB 이하의 압축파일을 받아 NFD로 된 항목 이름을 모두 NFC로 다시 쓰고, 수정된 ZIP을 내려받게 해 줍니다. 파일 내용은 그대로이고 처리는 브라우저 안에서 끝납니다. 수정된 압축파일을 다시 보내거나, 받는 쪽에서 원본을 같은 페이지에 넣어 직접 고치게 해도 됩니다. 다만 __MACOSX 폴더는 제거하지 않으므로, 그 부분이 중요하다면 이름을 정규화한 뒤 위에서 설명한 ditto나 zip -X로 압축을 다시 만드세요.

도구를 전혀 쓰고 싶지 않다면, 윈도우 쪽에서 압축을 푼 뒤 문제가 된 파일명을 손으로 다시 입력해도 됩니다. 파일이 몇 개뿐이라면 그게 가장 빠릅니다. 한글 이름의 문서가 200개쯤 든 폴더라면 이야기가 다릅니다.

윈도우 쪽 동료에게 알려 줄 내용

짧은 안내 한 줄이 오가는 메시지를 크게 줄여 줍니다. 예를 들면 이렇습니다.

  1. 탐색기의 기본 "압축 풀기"나 7-Zip, 반디집으로 풀어 주세요. 모두 맥에서 만든 ZIP을 제대로 읽습니다.
  2. __MACOSX 폴더가 있으면 지워도 됩니다. 안에 든 ._ 파일은 깨진 사본이 아니라 맥 메타데이터입니다.
  3. 이름은 멀쩡한데 프로그램이 파일을 못 연다면 파일명이 분해형인 것입니다. 손으로 이름을 바꾸거나, 압축 푼 파일을 FilenameFixer 웹앱에 올려 한 번에 바꾸면 됩니다.

받는 쪽이 개발자라면 PowerShell로 원인을 확인할 수 있습니다. [Text.Encoding]::UTF8.GetByteCount("한글")은 NFC 철자에서 6, NFD에서 그보다 큰 값을 돌려줍니다. Node, Python, .NET 모두 normalize("NFC")를 제공하므로 스크립트가 양쪽 형태를 다 받아야 한다면 이것을 쓰면 됩니다.

한계와 비슷해 보이는 다른 문제들

  • 긴 경로. 윈도우는 긴 경로 지원을 켜지 않으면 전체 경로를 260자로 제한합니다. 폴더 이름이 길고 깊게 중첩된 맥 폴더는 정규화와 무관하게 압축 해제가 실패할 수 있습니다. 압축 전에 최상위 폴더 이름을 줄이세요.
  • 4 GB가 넘는 압축파일은 ZIP64가 필요합니다. 현재 macOS의 zip과 ditto는 처리하지만 오래된 윈도우 도구는 못 여는 경우가 있습니다.
  • zip -e로 만든 암호 ZIP은 구형 암호화를 쓰기 때문에 7-Zip이나 반디집에서는 열리지만 윈도우 탐색기에서는 열리지 않습니다. 파일명 문제는 아니지만 "윈도우에서 안 열려요"라는 비슷한 답장을 만들어 냅니다.
  • 예약 문자. :, ?, *, |, <, >, "가 들어간 이름은 macOS에서는 허용되지만 윈도우에서는 안 되며, 탐색기가 압축 해제 시 거부하거나 이름을 바꿉니다. NFC 정규화는 이 문자들을 바꾸지 않으므로 직접 바꿔야 합니다.
  • 왕복. 윈도우 사용자가 파일을 편집해 ZIP으로 돌려보내도 문제가 생기지 않습니다. APFS에서는 NFC 이름이 그대로 유지됩니다. 문제는 맥에서 윈도우로 가는 방향에서만 생깁니다.

먼저 정규화하고, ditto나 zip -X로 압축하고, 목록을 확인하면 "파일명이 깨져요"라는 답장은 멈춥니다. 이미 상대방 메일함에 들어간 압축파일이라면, ZIP 안의 이름만 다시 써서 보내는 것이 가장 빠른 대체 방법입니다.