← 전체 글

USB 한글 파일명 자소분리: 맥에서 복사한 파일이 윈도우에서 깨질 때

맥에서 USB나 외장하드로 복사한 파일을 윈도우에서 열었을 때 한글 파일명 자소분리가 일어나 보고서.docx가 ㅂㅗㄱㅗㅅㅓ.docx처럼 보인다면, 파일도 USB도 멀쩡합니다. 파일 이름이 윈도우가 기대하는 유니코드 조합형(NFC)이 아니라 맥이 즐겨 쓰는 분해형(NFD)으로 저장돼 있을 뿐입니다. 한글은 자음과 모음이 따로 떨어지고, 일본어는 탁점이 가나에서 분리되며, José처럼 악센트가 붙은 이름은 검색이 안 됩니다. 해결은 이름을 조합형으로 다시 저장하는 것 하나이고, 방법은 세 가지입니다. 윈도우 쪽에서 PowerShell 몇 줄로 바꾸거나, 맥 쪽에서 짧은 Python 스크립트를 돌리거나, 터미널이 부담스러우면 FilenameFixer 같은 브라우저 도구에 파일을 끌어다 놓으면 됩니다. 세 방법 모두 아래에 순서대로 적었습니다.

맥에서 USB로 옮긴 파일명이 윈도우에서 자소분리되는 이유

맥과 윈도우 양쪽에서 읽히는 USB는 보통 exFAT이나 FAT32로 포맷되어 있습니다. 이 두 파일 시스템은 파일 이름을 손대지 않습니다. 운영체제가 넘겨준 유니코드 문자 순서를 그대로 기록할 뿐입니다. 문제는 바로 여기서 생깁니다. 같은 글자로 보이는 이름을 맥과 윈도우가 서로 다른 순서로 넘겨주기 때문입니다.

유니코드는 한 글자를 두 가지 방식으로 쓸 수 있습니다.

  • 조합형(NFC): 가는 코드 포인트 하나입니다. é도 하나입니다.
  • 분해형(NFD): 가는 초성 ㄱ 다음에 중성 ㅏ가 오는 두 개의 코드 포인트입니다. é는 e 뒤에 결합 악센트가 따로 붙습니다.

맥은 Finder에서 이름을 바꾸거나 맥 앱에서 저장할 때 분해형을 만드는 경우가 많습니다. 반면 윈도우, 웹 업로드 폼, 대부분의 서버는 조합형을 기대합니다. 그래서 USB를 윈도우 PC에 꽂으면 탐색기는 받은 그대로를 보여 주고, 결과는 이렇게 나타납니다.

  • 보고서.docx가 ㅂㅗㄱㅗㅅㅓ.docx로 보이거나, 멀쩡한 음절과 떨어진 자모가 뒤섞여 보입니다.
  • 김민수_이력서.pdf처럼 받침이 있는 이름은 ㄱㅣㅁㅁㅣㄴㅅㅜ_ㅇㅣㄹㅕㄱㅅㅓ.pdf처럼 더 길게 늘어집니다.
  • 일본 거래처가 보낸 がくせい.pdf는 か゛くせい.pdf로, 탁점이 옆에 둥둥 떠 보입니다.
  • José_계약서.pdf는 겉보기엔 멀쩡한데 탐색기 검색창에 José를 쳐도 안 나오고, 일부 프로그램은 열기나 가져오기를 거부합니다.

손상된 건 아무것도 없습니다. 파일 내용은 한 바이트도 바뀌지 않았습니다. 다만 이름의 철자 방식이 달라서, 윈도우가 "내가 타자로 친 이름과 같은 이름"으로 인식하지 못할 뿐입니다.

흔히 겪는 다른 USB 문제와는 구분해야 합니다. NTFS로 포맷돼서 맥에서 읽기 전용이 되는 경우나, 4GB가 넘는 파일이 FAT32에 복사되지 않는 경우는 포맷 문제입니다. 파일이 복사도 되고 열리기도 하는데 이름만 이상하다면, 포맷이 아니라 정규화(normalization) 문제입니다.

먼저 확인: 정말 자소분리(NFD) 문제인지

이름을 바꾸기 전에 원인부터 확인해 두면 안전합니다. 윈도우 PC에서 USB 안의 폴더를 열고 PowerShell을 실행한 뒤 다음을 붙여 넣습니다.

Get-ChildItem -File | ForEach-Object {
  [PSCustomObject]@{
    Name   = $_.Name
    Length = $_.Name.Length
    NFC    = $_.Name.Normalize([Text.NormalizationForm]::FormC).Length
  }
}

Length 열이 NFC 열보다 크면 그 이름에 분해형 글자가 들어 있다는 뜻입니다. 예를 들어 보고서.docx는 저장된 길이가 11인데 NFC 길이는 8로 나오고, 받침이 많은 다섯 글자 이름은 12 이상으로 나오기도 합니다. 두 숫자가 같은 줄은 이미 정상이므로 건드릴 필요가 없습니다.

윈도우 쪽에서 고치기 (무료, 설치 없음)

USB가 이미 거래처나 교수님, 동료 손에 넘어갔고 그쪽이 윈도우를 쓴다면 이 방법이 가장 현실적입니다. 작업이 전부 USB 안에서 끝나기 때문에 맥은 전혀 필요 없습니다.

  1. USB를 꽂고 파일 탐색기에서 해당 폴더를 엽니다.
  2. 주소창을 클릭해 powershell이라고 입력하고 Enter를 누릅니다. 그 폴더 위치에서 PowerShell 창이 열립니다.
  3. 아래 내용을 붙여 넣고 Enter를 누릅니다.
Get-ChildItem -Recurse |
  Sort-Object { $_.FullName.Length } -Descending |
  ForEach-Object {
    $nfc = $_.Name.Normalize([Text.NormalizationForm]::FormC)
    if ($nfc -ne $_.Name) {
      Rename-Item -LiteralPath $_.FullName -NewName $nfc
      Write-Host "renamed: $nfc"
    }
  }

이 명령은 USB 안의 모든 파일과 폴더를 돌면서, 깊은 경로부터 처리해 폴더 이름이 내용물 뒤에 바뀌도록 하고, 각 이름을 NFC로 변환한 뒤 실제로 달라지는 경우에만 이름을 바꿉니다. 이미 조합형인 이름은 그대로 둡니다. -LiteralPath가 중요한데, 깨진 이름 중에는 PowerShell이 와일드카드로 해석할 수 있는 문자가 섞여 있기 때문입니다.

  1. 탐색기에서 F5를 누릅니다. 한글과 일본어 이름이 제대로 보이고, José로 검색해도 파일이 잡혀야 합니다.

알아 둘 한계가 있습니다.

  • 한 폴더 안에 같은 이름의 NFD 버전과 NFC 버전이 이미 둘 다 있으면 그 쌍은 "파일이 이미 있습니다" 오류로 실패합니다. 어느 쪽을 남길지 직접 정해야 합니다.
  • 다른 프로그램에서 열려 있는 파일은 이름을 바꿀 수 없습니다. 한글, 워드, 엑셀, 포토샵 등을 먼저 닫으세요.
  • USB에 있는 사본만 고쳐집니다. 맥에 있는 원본은 여전히 분해형이라서, 다음에 또 넘길 때 같은 일이 반복됩니다. 근본적으로는 원본 쪽에서 고쳐야 합니다.

USB를 넘기기 전에 맥 쪽에서 고치기

맥 사용자이고 USB로 파일을 자주 전달한다면(인쇄소, 학교 과제 제출, 거래처 납품 등), USB가 책상을 떠나기 전에 이름을 고쳐 두는 편이 낫습니다. Finder에는 이런 설정이 없지만 Python 몇 줄이면 됩니다. Python 3는 Xcode Command Line Tools에 포함돼 있고, 터미널에서 python3 --version을 쳤을 때 버전 번호가 나오면 이미 있는 겁니다.

  1. 평소처럼 파일을 USB에 복사합니다.
  2. 터미널을 열고 아래를 실행합니다. MYDRIVE는 바탕화면에 보이는 USB 이름으로 바꿉니다.
python3 - <<'EOF'
import os, unicodedata
root_dir = '/Volumes/MYDRIVE'
for root, dirs, files in os.walk(root_dir, topdown=False):
    for name in files + dirs:
        fixed = unicodedata.normalize('NFC', name)
        if fixed != name:
            os.rename(os.path.join(root, name), os.path.join(root, fixed))
            print('renamed:', fixed)
EOF
  1. USB를 추출하고, 가능하면 윈도우 PC에서 확인합니다. 이름이 제대로 보이고 검색도 되어야 합니다.

두 가지를 알아 두세요. 첫째, 이 스크립트는 저장된 문자 순서만 바꾸기 때문에 맥에서는 전후 이름이 똑같아 보입니다. 정상입니다. 둘째, 조합형으로 바꾼 파일을 나중에 맥 앱에서 다시 편집해 같은 이름으로 저장하면 일부 앱은 다시 분해형으로 기록합니다. 그러니 며칠 전이 아니라 USB를 넘기기 직전에 스크립트를 돌리는 게 좋습니다.

터미널을 쓰고 싶지 않다면

FilenameFixer는 같은 변환을 브라우저에서 해 줍니다. USB에 있는 파일을 페이지에 끌어다 놓으면 NFD에서 NFC로 한꺼번에 이름을 바꿔 주고, 파일 이름은 브라우저 안에서 로컬로 처리되기 때문에 서버로 올라가지 않습니다. 한글 자소분리, 일본어 탁점 분리, 라틴 악센트 분리를 모두 다루며 무료입니다. 맥이든 윈도우든 브라우저만 있으면 됩니다.

낱개 파일이 아니라 ZIP 하나로 전달한다면, 압축 파일 안에도 똑같이 분해형 이름이 들어 있어서 윈도우에서 풀 때 깨져 나옵니다. ZIP 파일명 복원 도구는 압축 안의 이름을 고쳐 다시 써 주므로(200MB까지), 받는 쪽은 아무것도 실행하지 않고 압축만 풀면 정상 이름을 얻습니다.

다음번 전달에서 자소분리를 피하는 습관

어느 쪽에 있든 몇 가지 습관만 들이면 이 문제는 사라집니다.

  • 납품 파일 이름 규칙을 미리 정하세요. 회계 프로그램, CMS, 사진 관리 프로그램처럼 다른 시스템에 가져올 파일이라면 kim-minsu-contract-2026-10.pdf 같은 영문·숫자 이름이 정규화 문제와 그 밖의 문자 집합 문제를 한꺼번에 비켜 갑니다. 읽기 좋은 한글 이름은 문서 안이나 전달 메모에 적으면 됩니다.
  • 추출 직전에 정규화하세요. 모든 편집이 끝난 뒤 마지막 단계로 Python 스크립트를 돌리거나 폴더를 브라우저 도구에 올립니다.
  • 윈도우 쪽에 확인용 스크립트를 두세요. 위의 길이 비교 명령은 몇 초면 끝나고, 맥에서 온 USB를 고쳐야 하는지 바로 알려 줍니다. 누군가 파일을 시스템에 올렸다가 조용히 거부당하기 전에 잡을 수 있습니다.
  • USB를 다시 포맷해도 소용없습니다. NTFS, exFAT, FAT32 모두 이름을 받은 그대로 저장합니다. 포맷은 정규화와 무관하고, 이름을 바꾸는 것만이 해결책입니다.

이름이 조합형으로 정리되면 윈도우 검색이 파일을 찾고, 가져오기가 성공하고, 상대방은 한글이 있어야 할 자리에서 ㅎㅏㄴㄱㅡㄹ을 볼 일이 없습니다.