← 전체 글

맥 압축파일 한글 깨짐·자소분리, 윈도우에서 고치는 법

맥 압축파일 한글 깨짐은 증상이 두 가지로 갈립니다. 맥에서 받은 zip을 윈도우에서 풀었더니 회의록.hwp가 알 수 없는 한자나 기호 조합으로 보인다면, 압축을 푼 프로그램이 파일명 인코딩을 잘못 읽은 것입니다. 7-Zip이나 반디집처럼 UTF-8을 제대로 읽는 프로그램으로 다시 풀면 대부분 해결됩니다. 반대로 ㅎㅚㅇㅢㄹㅗㄱ.hwp처럼 자음과 모음이 따로 떨어져 보인다면(이른바 자소분리), 다시 풀어도 소용이 없습니다. 파일명 자체가 "조합되지 않은 글자(NFD)"로 저장돼 있어서, 압축을 푼 뒤 파일명을 정규화(NFC로 변환)해야 합니다. 같은 zip에서 두 문제가 함께 나오는 경우도 흔하므로, 먼저 내 증상이 어느 쪽인지 구분하는 것이 순서입니다.

맥 압축파일 한글 깨짐이 생기는 두 가지 원인

zip 파일에는 "파일명을 이렇게 인코딩한다"는 단일 규칙이 없습니다. 압축하는 프로그램이 파일명을 쓰는 방식을 정하고, 푸는 프로그램이 읽는 방식을 정합니다. 맥과 윈도우는 오랫동안 서로 다른 선택을 해 왔고, 한글 파일명이 바로 그 경계선 위에 놓여 있습니다.

원인 1: 코드 페이지가 달라서 생기는 글자 깨짐

Finder에서 폴더를 우클릭해 압축을 누르면 macOS는 zip 안의 파일명을 UTF-8로 기록합니다. 그런데 예전 윈도우 탐색기나 일부 압축 프로그램은 zip 안의 파일명이 윈도우 기본 코드 페이지(한국어 윈도우라면 CP949)로 쓰여 있다고 가정합니다. UTF-8 바이트를 CP949로 읽으면 전혀 엉뚱한 한자, 특수문자, 깨진 네모가 섞여 나옵니다.

이 경우 압축 파일 안의 데이터 자체는 멀쩡합니다. 푸는 쪽이 잘못 추측했을 뿐이라, 다른 프로그램으로 다시 풀면 됩니다.

원인 2: 자소분리(NFD) — 글자는 있는데 조합이 안 된 상태

압축이 완벽하게 풀려도 두 번째 문제가 남습니다. macOS는 한글 한 글자를 완성형 한 글자(한)가 아니라 초성·중성·종성을 따로 나열한 형태(ㅎ+ㅏ+ㄴ)로 저장하는 경향이 있습니다. 유니코드에서는 이를 정규화 형식 D(NFD)라고 부릅니다. 윈도우, 웹 브라우저, 대부분의 서버는 글자가 완성된 형태인 정규화 형식 C(NFC)를 기대합니다.

윈도우는 NFD로 된 이름의 파일도 아무 불평 없이 만들어 줍니다. 다만 화면에는 ㅎㅏㄴㄱㅡㄹ.docx처럼 자음 모음이 떨어진 채로 표시되고, 윈도우 입장에서는 키보드로 친 한글과 전혀 다른 문자열입니다. 그래서 다음과 같은 일이 생깁니다.

  • 탐색기 검색창이나 윈도우 검색에서 한글을 쳐도 해당 파일이 안 나옵니다.
  • 파일명으로 매칭하는 스크립트나 엑셀 수식이 하필 한글 파일에서만 실패합니다.
  • 풀어 놓은 폴더를 기존 폴더 옆에 복사하면 보고서_최종.hwp가 두 개 생기는데 크기와 날짜가 다릅니다.
  • 관공서 사이트, 학교 과제 제출, 그룹웨어 업로드가 거부되거나, URL에 %E1%84%92 같은 긴 코드가 붙어 저장됩니다.

이 증상에 해당한다면 다시 풀어도 달라지지 않습니다. 압축을 푼 뒤 파일명을 NFD에서 NFC로 바꿔야 합니다.

빠른 확인: 내 증상은 어느 쪽인가

파일 목록만 봐도 대개 구분이 됩니다.

  1. 읽을 수 없는 한자·기호가 보인다: 코드 페이지 문제, 원인 1입니다. 다음 섹션으로 가세요.
  2. ㅎㅏㄴㄱㅡㄹ처럼 자음 모음이 분리돼 있다: 자소분리, 원인 2입니다. 글자 모양으로 거의 확실하지만, PowerShell로 확인할 수도 있습니다.
$name = (Get-Item -LiteralPath "C:\Users\me\Downloads\extracted\회의록.hwp").Name
$name.Length
$name.IsNormalized([Text.NormalizationForm]::FormC)

의심되는 파일의 경로를 넣어 보세요. 회의록.hwp는 눈에 보이는 글자 수가 7인데 Length가 11처럼 훨씬 크게 나오고 IsNormalized가 False라면, 파일명이 분리된 상태입니다.

마우스가 편하다면 탐색기에서 파일을 선택하고 F2를 눌러 이름 변경 상태로 들어간 뒤, 한글 바로 뒤에 커서를 두고 Backspace를 한 번 눌러 보세요. 글자 전체가 아니라 종성이나 모음 하나만 지워지면 각 자소가 별도 문자로 저장된 것입니다.

글자 깨짐 해결: UTF-8을 읽는 프로그램으로 다시 풀기

먼저 이름이 깨진 채 풀린 폴더를 삭제하세요(사본이 두 개 생기지 않도록). 그다음 원본 .zip을 UTF-8 파일명을 읽는 프로그램으로 다시 풉니다.

반디집 또는 7-Zip (무료, 윈도우)

  1. 반디집이나 7-Zip 중 하나를 공식 사이트에서 설치합니다. 둘 다 UTF-8 파일명을 정상적으로 읽습니다.
  2. 탐색기에서 zip을 우클릭하고 반디집 › 여기에 풀기 또는 7-Zip › Extract Here를 선택합니다. 윈도우 11에서는 추가 옵션 표시를 먼저 눌러야 메뉴가 보일 수 있습니다.
  3. 풀린 파일명을 확인합니다. 깨져 있던 이름이 회의록.hwp로 읽혀야 합니다.

윈도우 10·11 기본 압축 풀기

최근 윈도우는 zip 안의 UTF-8 이름을 예전보다 훨씬 잘 처리합니다. 같은 파일을 최신 윈도우를 쓰는 동료가 풀었을 때 멀쩡하다면, 파일이 아니라 내 압축 프로그램이 문제입니다. 탐색기의 압축 풀기를 쓰거나 PowerShell에서 다음을 실행해 보세요.

Expand-Archive -LiteralPath "C:\path\to\archive.zip" -DestinationPath "C:\path\to\output"

반디집·7-Zip으로도 깨진다면

드물게 맥 쪽에서 오래되거나 특이한 압축 프로그램을 써서 파일명을 다른 인코딩으로 기록한 경우가 있습니다. 반디집과 WinRAR은 압축 파일을 열어 둔 상태에서 코드 페이지를 바꿀 수 있으니, 한국어·UTF-8·일본어 등을 바꿔 가며 이름이 정상으로 읽히는 설정을 찾아보세요. 그래도 안 되면 보낸 사람에게 Finder의 압축 메뉴나 터미널의 zip -r로 다시 압축해 달라고 요청하세요. 둘 다 UTF-8로 기록합니다.

이름이 정상으로 보이기 시작하면 앞 섹션의 자소분리 확인을 한 번 더 하세요. 원인 1을 해결하고 나니 그 밑에 원인 2가 숨어 있는 경우가 아주 흔합니다.

자소분리 해결: 압축을 푼 뒤 파일명 정규화

이 단계에서는 ㅎ+ㅏ+ㄴ을 한 글자 한으로 합칩니다. 폴더 안의 모든 한글 파일명, 그리고 혹시 섞여 있을 일본어나 악센트 붙은 알파벳도 함께 처리됩니다. 현실적인 방법은 두 가지입니다.

방법 A: PowerShell로 일괄 이름 변경 (추가 설치 없음)

지정한 경로 아래의 모든 파일과 폴더 이름을 NFC 형태로 바꿉니다. 중요한 폴더라면 먼저 사본에서 실행해 보세요.

$root = "C:\path\to\extracted"
Get-ChildItem -LiteralPath $root -Recurse |
  Sort-Object { $_.FullName.Length } -Descending |
  ForEach-Object {
    $fixed = $_.Name.Normalize([Text.NormalizationForm]::FormC)
    if ($fixed -ne $_.Name) {
      $target = Join-Path $_.Directory.FullName $fixed
      if (Test-Path -LiteralPath $target) {
        Write-Warning "건너뜀 (같은 이름이 이미 있음): $($_.FullName)"
      } else {
        Rename-Item -LiteralPath $_.FullName -NewName $fixed
      }
    }
  }

동작 방식에 대한 메모:

  • 가장 깊은 항목부터 이름을 바꾸므로, 폴더 이름이 바뀌어도 그 안에 있는 파일의 경로가 꼬이지 않습니다.
  • 정상 이름의 파일이 이미 있으면(보고서_최종.hwp가 두 개인 상황) 덮어쓰지 않고 건너뛰며, 어떤 파일을 직접 정리해야 하는지 알려 줍니다.
  • -LiteralPath가 중요합니다. 없으면 파일명에 들어 있는 대괄호가 와일드카드로 잘못 해석될 수 있습니다.

방법 B: 압축을 풀기 전에 zip 자체를 고치기

스크립트가 부담스럽거나, 정리된 압축 파일을 다른 사람에게 그대로 넘겨야 한다면 FilenameFixer의 ZIP 파일명 복구 도구를 쓰는 방법이 있습니다. 맥에서 받은 원본 zip(200 MB까지)을 올리면 안에 있는 분리된 파일명을 NFC로 다시 써서 수정된 압축 파일을 내려받게 해 줍니다. 처리는 브라우저 안에서 이루어지고 압축 파일이 서버로 업로드되지 않으므로, 계약서나 인사 자료가 들어 있는 zip이라도 외부로 나가지 않습니다. 무료이며, 이미 압축을 풀어 버린 경우에는 같은 웹앱에 파일을 끌어다 놓아 낱개 파일명을 일괄 변경할 수도 있습니다.

두 방법 모두 결과는 같습니다. 윈도우 검색, 스크립트, 웹 업로드 폼이 평범한 한글로 인식하는 파일명이 됩니다. 한글만이 아니라, 일본 거래처에서 온 압축 파일에서 탁점이 떨어져 나간 가나(か+゛)나 유럽 쪽 이름에서 분리된 악센트(e+´)도 같은 변환으로 함께 복구됩니다.

다음 압축 파일부터 문제를 줄이려면

대부분은 보내는 쪽에서 미리 막을 수 있지만, 전부는 아닙니다.

  • 보내는 사람에게 Finder의 압축 메뉴나 터미널 zip -r로 압축해 달라고 요청하세요. 둘 다 UTF-8로 기록하므로 최신 윈도우에서 글자 깨짐(원인 1)은 거의 사라집니다. 다만 NFC로 정규화해 주지는 않아서 자소분리(원인 2)는 여전히 생길 수 있습니다.
  • 여러 환경을 오갈 파일이라면 가능한 범위에서 파일명에 한글을 피하는 것도 방법입니다. report_final.pdf는 어디서나 살아남습니다. 물론 임시방편이지 해결책은 아니며, 사람 이름이나 공문서 제목처럼 한글이 꼭 필요한 경우에는 쓸 수 없습니다.
  • 진짜 고민이 "맥에서 올린 파일이 사이트에서 거부되는 것"이라면 업로드 시점에 고치는 쪽이 편합니다. FilenameFixer 크롬 확장 프로그램은 웹사이트에 파일을 올릴 때 파일명을 자동으로 NFC로 바꿔 주므로, 과제 제출 사이트나 관공서 포털이 한글을 조합된 글자로 받게 됩니다.
  • 개발자라면 업로드를 받는 서버 쪽에서 파일명을 NFC로 정규화하고, macOS와 윈도우 체크아웃 간에 경로를 비교하는 빌드·동기화 스크립트에서도 같은 처리를 하세요. 파이썬의 unicodedata.normalize("NFC", name), .NET의 String.Normalize()가 흔히 쓰입니다. Git에는 맥에서 클론한 저장소의 같은 문제를 다루는 core.precomposeunicode 설정이 있습니다.

솔직하게 짚어 둘 한계가 하나 있습니다. 윈도우 사용자가 자소분리된 이름 그대로 몇 달간 파일을 수정하고 저장해 왔다면, 나중에 변환할 때 정상 이름으로 저장된 같은 문서와 충돌할 수 있습니다. 위 PowerShell 스크립트와 ZIP 복구 도구 모두 그런 경우 원본을 건드리지 않고 남겨 두지만, 두 버전을 합치는 일은 결국 사람이 직접 해야 합니다. 이 글에서처럼 압축을 푸는 시점에 바로잡는 편이, 나중에 꼬인 것을 풀어내는 것보다 훨씬 수고가 적습니다.