← 전체 글

맥 압축파일 한글 깨짐, 윈도우에서 zip 이름 고치는 법

맥에서 만든 zip 파일을 윈도우로 옮긴 뒤 파일명이 깨져 보인다면, 원인은 대개 두 가지이고 둘 다 파일 내용을 건드리지 않고 고칠 수 있습니다. 하나는 윈도우가 잘못된 문자 인코딩으로 이름을 읽은 경우입니다(José.pdf처럼 알 수 없는 기호가 섞여 보입니다). 다른 하나는 맥이 쓰는 분해형 유니코드(NFD)로 이름이 저장되어 한글 글자나 악센트 글자가 자음과 모음으로 쪼개져 보이는 경우입니다(ㅂㅗㄱㅗㅅㅓ.docx). 첫 번째는 다른 압축 해제 프로그램으로 풀면 해결되고, 두 번째는 이름을 NFC 형태로 바꾸면 해결됩니다. 브라우저에서 처리하거나 짧은 PowerShell 명령을 써도 됩니다.

맥 압축파일 한글 깨짐이 생기는 이유

zip 형식은 파일 이름을 바이트 단위로 저장하고, 그 바이트가 UTF-8인지 아닌지를 알려주는 작은 표시를 함께 둡니다. 압축 안의 파일 데이터는 이 과정에서 바뀌지 않습니다. 그래서 문서 자체는 멀쩡하고 이름 표시만 깨집니다.

보통은 이런 식으로 일어납니다. 맥 사용자가 Finder에서 폴더를 선택하고 압축을 누른 뒤, 그 .zip 파일을 메일이나 메신저로 보냅니다. 윈도우에서 파일을 열고 모두 압축 풀기를 누르면 다음과 같은 이름이 나타날 수 있습니다.

  • ㅎㅏㄴㄱㅡㄹ.docx (원래 이름은 한글.docx)
  • ㅂㅗㄱㅗㅅㅓ_최종.pptx (원래 이름은 보고서_최종.pptx)
  • Jose´ Contract.pdf (원래 이름은 José Contract.pdf)

다른 경우에는 한글.docx나 José Contract.pdf처럼 전혀 읽을 수 없는 문자열이 나옵니다.

이 두 증상은 겉보기에는 비슷하지만 원인이 다릅니다.

인코딩 불일치(모지바케). 압축을 만든 프로그램은 UTF-8 바이트로 이름을 저장했지만 UTF-8이라는 표시를 제대로 남기지 않았습니다. 윈도우 탐색기는 이 바이트를 예전 방식의 코드 페이지로 해석해서 엉뚱한 문자열이 나옵니다. 원래 이름은 손상되지 않았고 잘못 읽혔을 뿐입니다.

분해형 유니코드(NFD). 맥은 많은 파일 이름에서 글자와 결합 요소를 따로 저장합니다. 예를 들어 가는 ㄱ과 ㅏ로, é는 e와 결합 악센트로 나뉩니다. 이 이름은 유니코드상 올바르고 윈도우도 받아들이지만, 윈도우 탐색기 검색, 웹 업로드 양식, 많은 서버는 글자를 하나로 합친 형태(NFC)를 기대합니다. 그래서 글자가 어색하게 보이고, 검색에서 빠지고, 이름을 비교하는 스크립트가 실패하고, 업로드 양식이 파일을 거부하거나 중복으로 처리하기도 합니다. 위의 ㅎㅏㄴㄱㅡㄹ가 이 경우입니다.

둘을 구분하는 데는 10초면 충분하니 먼저 확인하세요.

1단계: 어떤 문제인지 확인하기

압축을 푼 폴더를 열거나, 압축을 풀지 않고 탐색기에서 zip 안의 파일을 보세요. 깨진 이름 하나를 골라 살펴봅니다.

  1. 이름에 é, 한, ’처럼 실제 단어에 쓰이지 않는 문자가 섞여 있으면 인코딩 불일치입니다. Fix B로 넘어가세요.
  2. 이름은 읽을 수 있는데 글자와 악센트가 조금 떨어져 보이거나, 한글이 자음과 모음으로 나뉘어 보이면 NFD입니다. 다음 방법으로 한 번 더 확인하세요.
    • 파일을 마우스 오른쪽 버튼으로 누르고 이름 바꾸기를 선택합니다.
    • End 키를 누른 다음 Backspace를 한 번 누릅니다.
    • 글자 전체가 지워지지 않고 모음이나 악센트만 사라지면 이름이 분해된 상태입니다. 정상적인 NFC 이름에서는 Backspace 한 번에 한이나 é 같은 글자 하나가 통째로 지워집니다.

PowerShell을 쓸 수 있다면 다음 명령으로 바로 확인할 수 있습니다.

Get-ChildItem -Recurse -File | Where-Object {
  -not $_.Name.IsNormalized([Text.NormalizationForm]::FormC)
} | Select-Object FullName

목록에 나오는 파일은 NFD 상태입니다.

NFD로 깨진 zip 파일명 고치기 (Fix A)

고치는 방법은 두 가지입니다. 하나는 브라우저에서 zip 파일 자체를 고치는 방법이고, 다른 하나는 압축을 푼 뒤 파일 이름을 바꾸는 방법입니다.

방법 1: 브라우저에서 zip 안의 이름 고치기

zip 파일을 그대로 다른 사람에게 보내거나 원본 형태를 유지하고 싶다면 이 방법이 가장 간단합니다.

  1. 브라우저에서 zip 파일명 복구 도구를 엽니다.
  2. 다운로드 폴더에 있는 .zip 파일을 페이지로 끌어다 놓습니다. 200MB까지의 압축파일을 지원합니다.
  3. 도구가 압축 안의 파일 이름을 NFD에서 NFC로 바꾼 새 zip을 만들어 줍니다. 이 파일을 내려받습니다.
  4. 새 zip을 평소처럼 모두 압축 풀기로 풉니다. José Contract.pdf나 한글.docx가 제대로 표시되고, 탐색기 검색에도 잡힙니다.

파일 처리는 브라우저 안에서 이루어지며, 압축파일과 파일 이름은 서버로 업로드되지 않습니다. 고객 계약서나 인사 서류가 들어 있는 경우에 중요한 부분입니다. 이 도구는 무료입니다. 이미 압축을 풀어 낱개 파일이 있다면 같은 사이트에서 파일을 끌어다 놓고 여러 개를 한꺼번에 이름 바꾸기 할 수 있습니다.

방법 2: 압축을 푼 뒤 PowerShell로 이름 바꾸기

윈도우에는 이름을 정규화하는 데 필요한 기능이 이미 들어 있습니다. .NET은 오래전부터 유니코드 정규화를 지원해 왔습니다. 이 방법은 폴더 안의 이름을 직접 바꾸므로 원본을 복사해 둔 뒤 작업하세요.

  1. zip 파일을 평소처럼 풉니다.
  2. 압축을 푼 폴더를 열고 주소 표시줄을 클릭해 powershell을 입력한 뒤 Enter를 누릅니다. 해당 폴더에서 PowerShell 창이 열립니다.
  3. 아래 명령을 붙여넣고 Enter를 누릅니다.
Get-ChildItem -Recurse -File | ForEach-Object {
  $nfc = $_.Name.Normalize([Text.NormalizationForm]::FormC)
  if ($nfc -ne $_.Name) {
    Rename-Item -LiteralPath $_.FullName -NewName $nfc
  }
}
  1. 폴더 이름도 깨져 있다면 -File 대신 -Directory를 넣어 한 번 더 실행합니다. 이때 안쪽 파일을 먼저 바꾸고 폴더는 나중에 바꿔야 경로가 바뀌지 않습니다.

한 번만 쓸 때나 빌드 스크립트에 넣어 자동화하려는 개발자에게 적합합니다. 다만 원래 zip 파일은 바뀌지 않으며, 엉뚱한 폴더에서 실행하기 쉬우니 주의하세요.

인코딩 불일치로 깨진 zip 파일명 고치기 (Fix B)

José처럼 모지바케가 보인다면 정규화로는 해결되지 않습니다. 원래 바이트를 UTF-8로 다시 해석해야 합니다.

  1. 7-Zip(7-zip.org에서 무료로 받을 수 있습니다)이나 다른 압축 프로그램을 설치합니다. 이런 프로그램은 UTF-8 표시가 빠져 있어도 이름을 대개 바르게 읽습니다. 윈도우 기본 압축 해제 기능이 여기서 자주 실패합니다.
  2. zip 파일을 마우스 오른쪽 버튼으로 누르고 7-Zip → 여기에 풀기(또는 "폴더이름"에 풀기)를 선택합니다.
  3. 이름을 확인합니다. 제대로 읽히면 끝입니다.
  4. 이름은 읽히는데 글자가 여전히 쪼개져 있다면 두 문제가 동시에 있었던 것입니다. Fix A로 돌아가 풀린 파일의 이름을 정규화하세요.

다른 압축 프로그램으로도 이름이 계속 이상하게 나온다면, 보낸 쪽이 UTF-8이 아닌 예전 인코딩으로 압축했을 가능성이 큽니다. 이때는 상대에게 다시 압축해서 보내 달라고 요청하는 것이 가장 빠릅니다. 맥의 기본 압축 기능과 대부분의 주요 압축 앱은 UTF-8로 저장합니다. 문제는 오래되었거나 특이한 도구를 쓰거나, 윈도우 시스템 언어가 다른 PC에서 다시 묶은 zip인 경우에 주로 생깁니다.

다음부터 문제를 줄이는 습관

파일을 주고받는 양쪽에서 몇 가지만 지켜도 대부분 예방할 수 있습니다.

맥에서 보내는 쪽이라면: 압축하기 전에 파일 이름을 NFC로 정규화하면 받는 사람이 고칠 필요가 없습니다. 또는 zip 대신 클라우드 드라이브 공유 링크를 보내는 방법도 있습니다. 대부분의 클라우드 서비스가 업로드할 때 이름을 정규화하지만 모든 서비스가 그런 것은 아니므로, 테스트 파일로 한 번 확인해 보세요. 압축파일이 아니라 웹 양식에 파일을 올리는 경우에는 FilenameFixer 크롬 확장 프로그램이 웹사이트에 파일을 올릴 때 이름을 자동으로 고쳐 줍니다. 받는 쪽 시스템에 이미 Zoë가 있는데 보낸 파일 이름이 다르다는 이유로 양식 검증에서 걸리는 일을 줄일 수 있습니다.

윈도우에서 받는 쪽이라면: 7-Zip 같은 프로그램을 설치해 두고, 맥에서 만든 압축파일에서 한글, 일본어, 악센트 이름이 보이면 이름을 손으로 고치기 전에 10초짜리 Backspace 테스트부터 해 보세요. 대부분의 글꼴에서 분해형 이름과 합성형 이름이 똑같이 보이기 때문에, 손으로 고치다 보면 이름이 같아 보이는 파일 두 개가 생기기 쉽습니다.

개발자라면: 파일 업로드 처리기, 동기화 스크립트, 빌드 단계처럼 애플리케이션의 입구에서 NFC로 정규화하세요. Python의 unicodedata.normalize("NFC", name), Node.js의 name.normalize("NFC"), .NET의 String.Normalize()로 간단히 처리할 수 있습니다. 맥에서는 테스트가 통과하는데 리눅스 CI에서는 실패하고, 나중에 보니 "같은" 파일 이름이 서로 다른 바이트 배열이었던 상황을 뒤늦게 디버깅하는 것보다 훨씬 저렴합니다.

이 과정은 문서 내용을 바꾸지 않으므로 내용이 손상될 걱정은 없습니다. 잘못 짐작했을 때 생기는 가장 큰 불편은 압축파일을 한 번 더 푸는 것 정도입니다.