맥에서 만든 「한글 보고서.docx」를 윈도우 PC로 보냈더니 받은 쪽 탐색기에 ㅎㅏㄴㄱㅡㄹ ㅂㅗㄱㅗㅅㅓ.docx 라고 보인다면, 파일은 멀쩡합니다. 열면 내용도 그대로입니다. 바뀐 것은 이름을 적은 방식 하나뿐이고, 그 방식만 맞춰 주면 원래 이름으로 돌아옵니다.
한글 한 글자를 적는 두 가지 방법
컴퓨터는 글자를 번호(유니코드 코드 포인트)로 저장합니다. 그런데 한글 음절은 번호를 매기는 방법이 둘입니다.
- 완성형으로 한 번에 — 「한」 전체에 번호 하나(U+D55C)를 줍니다. 현대 한글 11,172자가 모두 이렇게 한 칸씩 자리를 갖고 있습니다.
- 조각을 이어서 — 초성 ㅎ(U+1112) + 중성 ㅏ(U+1161) + 종성 ㄴ(U+11AB) 세 번호를 차례로 적습니다. 이 조각들을 「조합형 자모」라고 하고, 화면에 그릴 때 한 글자로 모아야 합니다.
두 방법은 유니코드 표준에서 같은 글자로 취급합니다(정준 등가). 그래서 둘 중 하나로 통일하는 규칙이 있는데, 이것이 정규화(normalization)입니다.
| 정규화 형식 | 「한」을 적는 방식 | UTF-8 바이트 |
|---|---|---|
| NFC (조합) | U+D55C 한 개 | ED 95 9C (3바이트) |
| NFD (분해) | U+1112 U+1161 U+11AB | E1 84 92 E1 85 A1 E1 86 AB (9바이트) |
같은 「한」인데 저장되는 바이트는 전혀 다릅니다. 파일 이름이 NFD 로 적히면 한글 한 글자가 세 배 길어지고, NFC 를 기대하는 프로그램은 이 조각을 따로따로 읽습니다.
맥과 윈도우는 서로 다른 쪽을 씁니다
- macOS — 예전 기본 파일 시스템 HFS+ 는 파일 이름을 저장할 때 항상 분해형(NFD 의 변형)으로 바꿔 저장했습니다. 2017년부터 쓰는 APFS 는 이름을 받은 형태 그대로 보존하고 비교할 때만 형태를 가리지 않는데, Finder 를 비롯한 macOS 의 여러 부분이 여전히 분해형 이름을 만들어 내기 때문에 맥에서 만든 한글 파일 이름은 NFD 인 경우가 많습니다.
- 윈도우 — NTFS 는 이름을 받은 그대로 저장하고, 윈도우의 거의 모든 프로그램과 한글 입력기는 완성형(NFC)으로 이름을 만듭니다.
파일을 메일·메신저·USB·클라우드로 옮길 때 이름은 대개 바이트 그대로 따라갑니다. 맥의 NFD 이름이 그대로 윈도우에 도착하는 것입니다.
왜 낱자로 흩어져 보이나
유니코드 규칙대로라면 ㅎ+ㅏ+ㄴ 조각도 화면에서는 「한」 한 글자로 모아 그려야 합니다. 맥은 그렇게 그려서 사용자는 차이를 알 수 없습니다. 그런데 윈도우 탐색기와 맑은 고딕 같은 기본 글꼴 조합은 이 조각을 모아 그리지 못하고 낱자를 나란히 그립니다. 그래서 「ㅎㅏㄴㄱㅡㄹ」처럼 보입니다.
눈에 보이는 것만 문제가 아닙니다.
- 검색에 잘 걸리지 않습니다 — 검색창에 「보고서」를 치면 완성형 「보」를 찾는데, 파일 이름에는 ㅂ+ㅗ 조각이 들어 있어 형태를 맞춰 주지 않는 프로그램에서는 찾지 못합니다.
- 같은 이름이 둘 생깁니다 — 같은 폴더에 NFC 「보고서.docx」와 NFD 「보고서.docx」가 동시에 있을 수 있습니다. 윈도우에게는 서로 다른 문자열이기 때문입니다.
- 정렬이 어긋납니다 — 가나다순 정렬에서 조각 이름은 엉뚱한 자리로 갑니다.
- 웹 업로드에서 문제가 됩니다 — 일부 사이트·프로그램은 NFD 이름을 그대로 저장해 주소가 길어지거나, 같은 파일을 다른 파일로 인식합니다.
깨진 게 아니라서 되돌릴 수 있습니다
NFD → NFC 변환은 유니코드가 정한 규칙이라 정보 손실이 없습니다. ㅎ+ㅏ+ㄴ 은 언제나 「한」으로 돌아갑니다. 프로그래밍 언어에도 기본 기능으로 들어 있습니다 — 자바스크립트의 normalize('NFC'), .NET·PowerShell 의 String.Normalize(), 파이썬의 unicodedata.normalize('NFC', ...) 가 모두 같은 일을 합니다.
한글 파일명 복구 의 「파일·폴더」 탭이 이 변환을 합니다. 파일을 끌어다 놓으면 「윈도우에서 보이던 이름」과 「고친 이름」을 나란히 보여 주고, 하나씩 또는 ZIP 으로 받을 수 있습니다.
다른 글자도 같은 일이 생깁니다
분해·조합은 한글만의 일이 아닙니다.
- 일본어 탁점 — 「が」는 「か」 + 탁점(U+3099)으로도 적을 수 있어, 맥에서 보낸 일본어 파일 이름도 윈도우에서 「か゛」처럼 갈라집니다.
- 라틴 문자 부호 — 「é」는 「e」 + 결합 악센트(U+0301)로도 적습니다. 프랑스어·독일어·베트남어 이름도 영향을 받습니다.
이 도구는 한글뿐 아니라 이런 글자도 함께 NFC 로 바꿉니다.
압축 파일이면 사정이 하나 더 있습니다
맥에서 ZIP 으로 묶어 보내면 「ㅎㅏㄴㄱㅡㄹ」이 아니라 蹂닿퀬 나 꼪뀳 같은 엉뚱한 글자가 나오기도 합니다. 이것은 NFD 문제에 「글자표(인코딩)」 문제가 겹친 경우입니다. 맥에서 압축한 ZIP 이 윈도우에서 깨지는 이유 에서 따로 설명합니다.
정리
- 맥은 한글 파일 이름을 조각(NFD)으로, 윈도우는 완성형(NFC)으로 다룹니다.
- 파일은 망가지지 않았습니다. 이름의 표기 방식만 다릅니다.
- NFC 로 바꾸면 손실 없이 원래 이름이 됩니다 — 받은 쪽에서 고치려면 윈도우에서 한 번에 고치기, 보내는 쪽에서 막으려면 맥에서 보내기 전에 막기 를 보세요.