문자와 단어를 세는 일은 단순해 보이지만, 한글은 조사가 단어에 바로 붙는 교착어 구조와 완성형 음절 블록이라는 두 가지 특징 때문에 다른 언어와는 다른 방식으로 접근해야 합니다.
한국어는 띄어쓰기를 하지만, 어절과 단어는 다르다
한국어는 중국어·일본어·태국어와 달리 띄어쓰기를 사용하지만, 띄어쓰기의 단위는 "단어"가 아니라 "어절"입니다. 조사("이", "가", "을", "를")는 명사에 공백 없이 바로 붙기 때문에, "아버지가"는 하나의 어절이지만 언어학적으로는 "아버지"(명사)와 "가"(조사) 두 개의 단어입니다. 이 때문에 스페이스 기반 단어 수 세기는 실제로는 "어절 수"를 세는 것에 가깝습니다.
띄어쓰기 하나로 뜻이 바뀌는 문장
한국어 띄어쓰기 규칙은 상당히 엄격하고 복잡해서, 모국어 화자도 자주 틀립니다. 흔히 예로 드는 문장이 "아버지가방에들어가신다"인데, 띄어쓰기에 따라 "아버지가 방에 들어가신다"(아버지가 방에 들어가신다)로도, "아버지 가방에 들어가신다"(아버지의 가방에 들어가신다)로도 읽힐 수 있습니다. 띄어쓰기는 단순한 스타일이 아니라 문장의 의미 자체를 바꾸는 요소입니다.
완성형 한글과 조합형 한글: 같은 글자, 다른 코드 포인트 수
"한" 같은 한글 음절은 유니코드에서 미리 조합된 완성형 문자 하나로 저장될 수도 있고, 초성·중성·종성 자모(ㅎ+ㅏ+ㄴ) 세 개가 결합한 형태로 저장될 수도 있습니다. 특히 macOS의 파일 시스템은 한글을 자모 분리형(NFD)으로 저장하는 경우가 있어, 같은 글자라도 시스템에 따라 코드 포인트 수를 다르게 세는 문제가 실제로 발생합니다.
이 기능이 필요한 이유
- 문자 수 제한(트윗, SMS, 폼 필드)에 맞춰 텍스트 확인하기.
- 같은 문장이 띄어쓰기에 따라 어절 수가 달라지는 이유를 확인하기.
- 텍스트의 "보이는" 길이와 코드의 문자 카운터가 보고하는 길이의 차이를 진단하기.
공백이 없는 언어의 단어 수 세기
중국어, 일본어, 태국어에서는 전통적으로 단어를 공백으로 전혀 구분하지 않습니다 — 단어의 경계는 구분자가 아니라 문법과 문맥이 정합니다. 한국어가 띄어쓰기를 사용하는 것과 달리, 이런 언어에서는 시각적인 단서 자체가 없기 때문에 전용 텍스트 분절 알고리즘이 필요하며, 단순히 공백 기준으로 세면 의미 있는 결과를 얻을 수 없습니다.