맥에서 윈도우로 보낸 파일명이 깨지는 이유
맥에서 만든 파일을 윈도우 PC로 보냈더니 파일명이 'ㅎㅏㄴㄱㅡㄹ'처럼 풀려 보이거나, 악센트가 분리되어 나타난 적이 있나요? 이것은 유니코드의 NFD와 NFC 차이 때문에 발생하는 문제입니다.
유니코드란?
유니코드는 전 세계 모든 문자를 표현하기 위한 국제 표준입니다. 각 문자에 고유 번호(코드 포인트)를 부여합니다. 예를 들어 'A'는 U+0041이고, '한'은 U+D55C입니다.
NFC vs NFD: 문제의 근본 원인
유니코드에서는 일부 문자를 두 가지 방식으로 표현할 수 있습니다:
NFC (조합형)
문자가 하나의 코드 포인트로 저장됩니다. 예를 들어 '한'은 U+D55C 하나로 저장됩니다.
NFD (분해형)
문자가 기본 문자와 결합 문자로 분리됩니다. '한'이 'ㅎ'(U+1112) + 'ㅏ'(U+1161) + 'ㄴ'(U+11AB) 세 개로 저장됩니다.
두 형태는 화면에서는 똑같이 보이지만, 메모리에 저장되는 방식이 다릅니다. 이 차이가 파일명 깨짐의 근본 원인입니다.
왜 macOS는 NFD를 사용할까?
Apple은 HFS+ 파일 시스템(이후 APFS)에서 NFD를 선택했습니다. 분해된 형태가 문자열 비교와 정렬을 단순화하기 때문입니다. macOS가 파일을 저장할 때 파일명을 자동으로 NFD로 변환합니다. 반면 Windows와 Linux는 일반적으로 NFC를 사용합니다. 그래서 맥에서 윈도우로 파일을 옮기면 파일명이 깨져 보이는 것입니다.
🇰🇷 한국어: 가장 눈에 띄는 경우
한국어는 이 문제가 가장 극적으로 나타납니다. NFC에서 '한'은 하나의 문자(U+D55C)입니다. NFD에서는 초성 'ㅎ'(U+1112) + 중성 'ㅏ'(U+1161) + 종성 'ㄴ'(U+11AB) 세 개의 자모로 분해됩니다. 그래서 '한글.txt'라는 파일명이 윈도우에서 'ㅎㅏㄴㄱㅡㄹ.txt'로 보이는 것입니다.
ㅎㅏㄴㄱㅡㄹ.txt한글.txt🇫🇷 프랑스어: 분리된 악센트
프랑스어의 악센트 문자(e, e, e, c 등)가 영향을 받습니다. NFD에서 'resume.pdf'는 'r + e + 결합 악센트 + sum + e + 결합 악센트.pdf'가 됩니다. 일부 시스템에서는 비슷하게 보일 수 있지만, 파일 검색이나 정렬에서 문제가 발생할 수 있습니다.
résumé.pdfrésumé.pdf🇩🇪 독일어: 깨진 움라우트
독일어 움라우트(o, u, a)가 NFD에서 분해됩니다. 'Uber.docx'가 'U + 결합 분음 부호 + ber.docx'가 됩니다. 윈도우나 리눅스 사용자와 파일을 공유할 때 문제가 발생할 수 있습니다.
Über.docxÜber.docx🇻🇳 베트남어: 복잡한 발음 부호
베트남어는 문자에 여러 발음 부호가 붙는 경우가 많아 특히 영향을 많이 받습니다. 'ệ' 같은 문자가 'e + 결합 곡절 부호 + 결합 아래 점' 이렇게 세 개의 코드 포인트로 분해될 수 있습니다.
Việt Nam.txtViệt Nam.txt🇪🇸 스페인어: n 문제
스페인어의 n(에녜)은 하나의 U+00D1에서 'N' + 결합 물결표(U+0303)로 분해됩니다. 악센트가 있는 모음(a, e, i, o, u)도 모두 영향을 받습니다.
España.txtEspaña.txt언제 이 문제가 발생하나요?
- 맥에서 윈도우로 이메일 첨부파일 보낼 때
- USB 드라이브로 파일 공유할 때
- 클라우드 스토리지에 업로드할 때 (구글 드라이브, 드롭박스, 원드라이브)
- 네트워크로 파일 전송할 때 (NAS, SMB 공유)
- 맥에서 만든 ZIP 파일을 윈도우에서 풀 때
- 버전 관리 시스템 사용 시 (Git)
FilenameFixer는 어떻게 해결하나요?
FilenameFixer는 JavaScript의 String.prototype.normalize() 메서드를 사용하여 파일명을 NFD에서 NFC로 변환합니다. 모든 변환은 브라우저에서만 이루어지며, 파일이 서버에 업로드되지 않습니다. 파일 내용은 전혀 변하지 않고 파일명만 변경됩니다.
왜 브라우저에서 처리하나요?
브라우저에서 처리하면 데이터가 기기 밖으로 나가지 않습니다. 서버를 신뢰할 필요도 없고, 개인정보 유출 위험도 없습니다. 오프라인에서도 사용할 수 있고 처리 속도도 매우 빠릅니다.