윈도우에서 만든 한글 파일을 맥을 거쳐 다시 서버에 올렸더니, 파일명이 "가나다"가 아니라 "ㄱㅏㄴㅏㄷㅏ"처럼 자모가 분리된 채로 깨지는 현상이 있을 때 해결하는 방법입니다. 원인은 운영체제마다 한글(유니코드)을 저장하는 정규화 방식이 다르기 때문인데요, 이번 글에서는 그 원인과 해결 방법을 정리해보겠습니다.
1. 원인: NFC vs NFD
같은 "각"이라는 글자도 유니코드로 저장하는 방식이 두 가지입니다.
- NFC(완성형): "각"을 하나의 코드포인트로 저장 (윈도우, 대부분의 리눅스)
- NFD(조합형): "ㄱ + ㅏ + ㄱ"으로 분리해 저장 (맥OS의 APFS/HFS+)
즉 맥에서 만들어지거나 맥을 거쳐간 파일명은 NFD로 저장되고, 이게 윈도우나 서버로 넘어가면 자모가 분리된 채로 보이는 것입니다.
2. 확인: 파이썬으로 정규화 형태 보기
깨진 문자열이 NFD인지 확인하거나, NFC로 합쳐볼 수 있습니다.

3. 서버단에서 정규화 처리 (권장)
가장 확실한 해법은 파일을 받는 서버에서 파일명을 NFC로 정규화해 저장하는 것입니다.
- 파이썬: unicodedata.normalize("NFC", name)
- 자바: java.text.Normalizer.normalize(name, Normalizer.Form.NFC)
클라이언트(브라우저)단 검증은 우회될 수 있으니, 정규화는 반드시 서버단에서 처리합니다.
4. 메일/전송 경로도 점검
같은 파일이라도 "A 메일에서는 멀쩡한데 B 메일에서는 깨진다"면, 수신 시 자동 NFC 정규화를 해주는 시스템과 NFD 그대로 전달하는 시스템의 차이일 수 있습니다. 경로별로 한 번씩 테스트해 두면 문의가 들어와도 빠르게 대응할 수 있습니다.
5. 실제 적용: 레거시 자바 업로드에 한 줄 추가
오래된 자바 웹(서블릿/Struts 시절)에서는 O'Reilly cos 라이브러리의 MultipartRequest로 업로드를 처리하는 경우가 많습니다. 파일을 받은 뒤 저장된 이름을 꺼내는 이 부분이 깨짐이 시작되는 지점입니다.
변경 전 - 받은 이름을 그대로 쓰면, 맥에서 올린 파일은 NFD인 채로 DB에 기록됩니다.

변경 후 - 받은 직후 NFC로 정규화하고, 디스크에 이미 저장된 실제 파일명까지 같은 이름으로 맞춰줍니다.

여기서 포인트는 두 가지입니다.
- 정규화한 이름만 DB에 넣고 디스크는 그대로 두면, 실제 파일명(NFD)과 어긋나 나중에 파일을 못 찾습니다. 그래서 renameTo로 실제 파일까지 NFC로 맞춰줍니다.
- Normalizer는 JDK 기본(java.text) 클래스라 외부 라이브러리를 추가할 필요가 없습니다.
※ 파일명 길이도 같이 보면 좋습니다. OS별 파일명 최대 바이트(보통 255바이트) 제한이 있어, 자모가 분리되면 바이트 수가 늘어 길이 초과로 또 깨질 수 있습니다.
※ URL로 파일을 노출한다면 파일명은 영어와 언더바(_)로 통일하는 것이 인코딩 깨짐을 원천 차단하는 가장 안전한 방법입니다.
함께 보면 좋은 글:
- 윈도우 터미널(Windows Terminal)에서 특수문자가 뒤 글자와 겹쳐 보일 때 (유니코드 모호폭, Ambiguous Width) - 같은 유니코드 함정 편
여기까지 맥에서 받은 한글 파일명이 자모 분리될 때 NFC/NFD 정규화로 해결하는 방법에 대해서 작성해봤습니다. 여기까지 읽어주셔서 감사합니다!
'일상' 카테고리의 다른 글
| 제미나이(Gemini) CLI 종료, 안티그래비티(Antigravity) CLI 설치하기 (윈도우 한글 깨짐 해결까지) (0) | 2026.06.21 |
|---|---|
| 패스터위스퍼(faster-whisper)로 한국어 음성을 텍스트로 (GPU 메모리 부족까지 잡기) (0) | 2026.06.21 |
| MariaDB 접근 권한 거부(원격 접속) 해결 방법 (0) | 2024.06.19 |
| 중소기업 청년대출 100% 입주 후기(행복주택) (0) | 2024.06.19 |
| 경기도 행복주택(수원광교) 입주 후기 #3(입주자격심사) (0) | 2024.06.19 |