글자수 세기
입력한 텍스트의 글자수, 단어수, 문장수, 바이트수를 실시간으로 세어줍니다.
글자수 · 바이트 카운터 — 문자열은 왜 코드포인트로 안 세어지는가
이 도구는 입력 텍스트의 문자 수(공백 포함/제외), 단어 수, 문장 수, 문단 수, 그리고 EUC-KR과UTF-8 두 인코딩의 바이트 수를 실시간으로 계산합니다. 단순해 보이는 기능이지만 내부적으로는 Unicode 표준(현재 15.1)의 복잡한 규칙, JavaScript String.length가 실제로는 UTF-16 코드 유닛을 센다는 사실, 그리고 한글 완성형(EUC-KR) vs 조합형(UTF-8)의 인코딩 차이를 고려해야 합니다.
1. String.length가 거짓말하는 순간
ECMAScript 표준(ECMA-262 §6.1.4)에 따르면 JavaScript 문자열은 UTF-16 code unit 시퀀스입니다. 따라서 "a".length는 1이지만, 이모지 "😀".length는2입니다. 😀(U+1F600)는 BMP(Basic Multilingual Plane) 밖의 코드포인트라 서러게이트 페어(D83D + DE00)로 표현되기 때문입니다. 정확한 "사람이 보는 문자 수"를 세려면[...str].length 또는 Array.from(str).length처럼 이터레이터를 써서 code point 기준으로 세어야 합니다. 이 도구는 후자의 방식으로 동작합니다.
2. 한글 바이트 계산 — 인코딩별 표
| 문자 | UTF-8 | UTF-16 | EUC-KR |
|---|---|---|---|
| A (U+0041) | 1 byte | 2 bytes | 1 byte |
| 가 (U+AC00) | 3 bytes | 2 bytes | 2 bytes |
| 漢 (U+6F22) | 3 bytes | 2 bytes | 2 bytes |
| 😀 (U+1F600) | 4 bytes | 4 bytes | n/a |
규칙은 단순합니다. UTF-8은 RFC 3629 정의대로 U+0000~U+007F는 1바이트, U+0080~U+07FF는 2바이트, U+0800~U+FFFF(한글 대부분 포함)는 3바이트, 보조 평면(이모지)은 4바이트입니다. EUC-KR(KS X 1001)은 고정 2바이트로 완성형 11,172개 한글을 표현하지만 이모지 같은 확장 문자는 표현할 수 없어 NLS 변환 시 ?로 치환됩니다.
3. 실전 시나리오
- SMS/LMS 발송 — 국내 통신사 SMS는 EUC-KR 80바이트(한글 45자), LMS는 2,000바이트. UTF-8이 아닌 EUC-KR 계산이 필요
- DB 컬럼 크기 산정 — MySQL
VARCHAR(255)는 utf8mb4에서 최대 1020바이트. 한글 닉네임 255자 허용 시 utf8mb4가 필수 - 메타 태그 최적화 —
<meta name="description">은 SERP에서 약 155~160자로 잘림. 공백 포함 기준 - 논문/자소서 — 한국 기업 자소서는 공백 포함, 공모전은 공백 제외인 경우가 많아 양쪽 카운트 필수
4. 단어·문장 경계의 모호함
영어는 공백(\s+)으로 단어를 세기 쉽지만 CJK 언어에는 단어 경계가 명시적이지 않아Unicode Text Segmentation(UAX #29)가 권장됩니다. 이 도구는 실용적 타협으로 공백·개행을 구분자로 쓰며, 문장은 .?! 종결부호로 분리합니다. 정확한 형태소 분석이 필요하면 KoNLPy, mecab-ko 같은 전용 라이브러리를 써야 합니다.
5. 크로스 플랫폼 이슈 — BOM과 개행
Windows 메모장에서 저장한 파일은 UTF-8 BOM(EF BB BF, 3바이트)이 선두에 붙습니다. 이 도구는 브라우저 텍스트 영역에 붙여 넣을 때 BOM이 자동 제거되지만, 원본 파일의 총 바이트를 셀 때는 BOM 3바이트를 별도로 더해야 합니다. 또한 개행 문자는 Windows가 CRLF(\r\n, 2바이트), Unix/macOS가 LF(\n, 1바이트)라 같은 글을 저장해도 OS에 따라 파일 크기가 달라집니다.
관련 도구
UTF-8로 인코딩한 문자열을 Base64로 감쌀 일이 잦다면Base64 인코더와 함께 쓰세요. URL 쿼리스트링에 한글이 들어갈 때의 바이트 확장은URL 인코더에서 확인할 수 있고, JSON payload 내 문자열 필드 길이 검증은JSON 포매터와 병행하면 편리합니다.
참고 자료
- Unicode Standard 15.1 — Chapter 3 Conformance, UAX #29 Text Segmentation
- IETF RFC 3629 — UTF-8, a transformation format of ISO 10646
- ECMA-262 §6.1.4 — The String Type
- KS X 1001 — 한국어 정보 교환용 부호계(완성형 한글)