도구스개발

유니코드 정규화 (NFC·NFD)

한글 자소가 흩어진 문자열을 NFC로 되돌리고 NFD·NFKC·NFKD 네 형식을 서로 비교합니다. 코드포인트 단위로 뜯어보며 왜 겉보기가 같은데 다른 문자열인지 확인합니다.

입력한 내용은 서버로 전송되지 않습니다.

NFD 로 저장된 한글입니다. 겉보기는 같지만 코드포인트가 자모 단위로 흩어져 있습니다.

이 문자열은 NFD (분해형) 입니다

15자 · 37바이트

조합·분해에 따라 문자열이 달라지는 글자가 들어 있습니다. 비교하기 전에 정규화가 필요합니다.

NFC8자 · 16B한글파일.txt
NFD15자 · 37B한글파일.txt
NFKC8자 · 16B한글파일.txt
NFKD15자 · 37B한글파일.txt

형식이 하는 일

NFC (조합)합칠 수 있는 것은 합칩니다. 웹·윈도우·리눅스의 기본값입니다.
NFD (분해)쪼갤 수 있는 것은 쪼갭니다. 맥 파일시스템이 이 형식을 씁니다.
NFKC (호환 조합)① → 1, ㈜ → (주) 처럼 호환 문자까지 바꿉니다. 원문이 달라집니다.
NFKD (호환 분해)호환 문자를 바꾼 뒤 쪼갭니다. 원문이 달라집니다.

코드포인트로 뜯어보기

U+1112 U+1161 U+11AB U+1100 U+1173 U+11AF U+1111 U+1161 U+110B U+1175 U+11AF. U+002Et U+0074x U+0078t U+0074

파란 칸은 앞 글자에 붙는 결합 문자입니다. 한글이 NFD 로 저장되면 중성·종성이 여기에 해당합니다.

맥에서 만든 zip 을 윈도우에서 풀면 한글이 흩어지는 문제가 여기서 나옵니다. 애플 파일시스템이 NFD 를 쓰고 윈도우·리눅스가 NFC 를 쓰는데, zip 파일에는 어느 쪽인지 적는 자리가 없어 그대로 전달되기 때문입니다. 파일명이 ‘ㅎㅏㄴ’ 처럼 보인다면 NFD 로 저장된 것이고, NFC 로 바꾸면 되돌아옵니다.
겉보기가 같아도 문자열은 다릅니다. ‘한’ 은 완성된 글자 하나(U+D55C)로도, 자모 셋(U+1112 U+1161 U+11AB)으로도 쓸 수 있습니다. 화면에는 똑같이 보이지만 === 로 비교하면 다르고, 데이터베이스 검색이나 파일명 대조에서 못 찾는 일이 생깁니다. 비교하기 전에 양쪽을 같은 형식으로 정규화하는 것이 답입니다.

사용 방법

  1. 1자소가 흩어진 파일명이나 문자열을 붙여 넣습니다.
  2. 2NFC 결과를 복사해 쓰면 대부분의 한글 깨짐이 해결됩니다.
  3. 3코드포인트 목록에서 결합 문자가 어디에 붙어 있는지 확인할 수 있습니다.

자주 묻는 질문

애플 파일시스템이 한글을 자모 단위(NFD)로 저장하고 윈도우·리눅스는 완성된 글자(NFC)로 저장하는데, zip 파일에 어느 쪽인지 적는 자리가 없어 그대로 전달되기 때문입니다. 파일명이 “ㅎㅏㄴ”처럼 보이면 NFD로 저장된 것이고, NFC로 바꾸면 되돌아옵니다.

NFC는 합칠 수 있는 것을 합치고 NFD는 쪼갤 수 있는 것을 쪼갭니다. “한”은 NFC에서 코드포인트 하나(U+D55C)지만 NFD에서는 초성·중성·종성 셋으로 나뉩니다. 화면에는 똑같이 보이지만 문자열로 비교하면 다릅니다.

검색어를 맞추거나 표기를 통일할 때 씁니다. K가 붙으면 호환 문자까지 표준형으로 갈아치워 ①이 1이 되고 ㈜가 (주)가 되며 전각 A가 반각 A가 됩니다. 다만 원문이 달라지므로 저장하거나 표시할 값에는 쓰지 마세요.

그럴 가능성이 큽니다. 데이터베이스에 NFC로 저장된 값을 NFD 문자열로 찾으면 일치하지 않습니다. 저장할 때와 찾을 때 모두 같은 형식으로 정규화하는 것이 해결책이며, 보통 NFC를 씁니다.

늘어납니다. UTF-8 기준으로 완성형 한글 한 글자는 3바이트지만, 받침이 있으면 자모 셋으로 나뉘어 9바이트, 받침이 없으면 둘로 나뉘어 6바이트가 됩니다. 파일명 길이 제한에 걸리는 일도 이 때문에 생깁니다.

알아두면 좋은 점

  • 브라우저에 내장된 String.prototype.normalize를 그대로 씁니다. 입력값이 서버로 전송되지 않습니다.
  • zip 파일 안의 이름을 직접 고치지는 못합니다. 풀어낸 파일명을 여기서 바꾼 뒤 이름을 다시 지정하세요.

함께 보면 좋은 도구

마지막 검증: 2026년 8월 30일 · 결과는 참고용 추정치입니다.