글자 수가 세 가지로 나오는 이유
"코드포인트"는 유니코드가 글자에 매긴 번호의 개수이고, 사람이 생각하는 글자 수에 가장 가깝습니다. "UTF-16 단위"는 자바스크립트의 .length가 세는 값으로, 이모지나 일부 한자처럼 U+FFFF를 넘는 문자는 2단위로 셉니다. "UTF-8 바이트"는 파일이나 네트워크에서 차지하는 크기로, 영문 1바이트·한글 3바이트·이모지 4바이트입니다. DB 컬럼 길이 제한이나 SMS 글자 수가 예상과 다를 때 이 셋을 구분하면 원인이 보입니다. 분석은 브라우저에서만 이루어집니다.
보이지 않는 문자가 들어오는 경로
웹 페이지나 워드 문서에서 복사할 때 제로 폭 공백(U+200B), 줄바꿈 방지 공백(NBSP, U+00A0), BOM(U+FEFF), 소프트 하이픈(U+00AD)이 딸려 오는 일이 흔합니다. 눈에는 안 보이지만 문자열 비교·검색·중복 제거가 모두 실패하고, 코드에 들어가면 문법 오류로 나타납니다. 엑셀에서 TRIM으로 안 지워지는 공백은 대부분 NBSP입니다. 분석 표에서 붉게 표시된 줄이 그 문자이고, "숨은 문자 제거" 작업으로 걷어낼 수 있습니다. 단, 아랍어·힌디어 같은 문자에서는 제로 폭 결합자(ZWJ/ZWNJ)가 정상적인 글자 구성 요소이고, 이모지 조합(👨👩👧)에도 ZWJ가 쓰이므로 그런 텍스트에서는 제거하면 모양이 깨집니다.
NFC와 NFD
"한"이라는 글자는 완성형 한 코드(U+D55C)로도, 자모 셋(ㅎ+ㅏ+ㄴ, U+1112 U+1161 U+11AB)으로도 표현할 수 있습니다. 화면에는 똑같이 보이지만 문자열로는 다릅니다. macOS에서 만든 파일명이 Windows에서 자모가 분리되어 보이는 문제가 바로 NFD(분해형)와 NFC(조합형)의 차이입니다. 비교·검색 전에 NFC로 통일하는 것이 일반적인 해결책이고, 이 도구의 NFC 정규화가 그 작업입니다. 악센트 붙은 라틴 문자(é = e + ´)도 같은 원리입니다.
문자 종류 판정
종류는 유니코드 스크립트 속성(\p{Script=Hangul} 등)으로 대략 분류한 것이며 공식 문자 이름은 아닙니다. 보이지 않는 문자 30여 종은 이름을 직접 표에 넣어 두었습니다. 정확한 문자 이름이 필요하면 코드포인트를 유니코드 공식 차트에서 찾아보면 됩니다.
자주 묻는 질문
이모지 하나가 여러 코드포인트로 나와요.
피부색 수식자, 국기(지역 표시 문자 두 개), 가족 이모지(ZWJ로 연결) 등은 여러 코드포인트가 모여 한 글자처럼 보이는 것입니다. 정상입니다.
제거했더니 단어가 붙어 버렸어요.
NBSP 같은 "공백류"는 일반 공백으로 바꾸는 옵션이 켜져 있어야 단어 사이가 유지됩니다. 옵션이 꺼져 있으면 제로 폭 문자와 함께 삭제됩니다.
한글 자모가 따로따로 보여요.
NFD 상태입니다. NFC 정규화를 선택하면 완성형으로 합쳐집니다.