글자 수 카운터
이모지와 결합 문자가 섞인 문자열을 의미 있는 다섯 가지 지표로 동시에 측정합니다.
입력
글자 수
0코드 포인트
0UTF-16 단위
0단어 수
0줄 수
0"이 문자열은 얼마나 긴가"에 답이 하나가 아닌 이유
사소한 질문처럼 들리지만, 텍스트의 길이는 무엇을 세느냐에 따라 완전히 달라집니다. 사람은 눈에 보이는 글자를 셉니다. 데이터베이스는 값이 차지하는 저장 공간을 셉니다. JavaScript는 또 다른 것을 셉니다. 이 숫자들이 어긋날 때 — 이모지, 악센트 붙은 글자, 비라틴 문자에서는 자주 그렇습니다 — 하나의 "길이"는 오해를 부릅니다. 이 도구는 의미 있는 다섯 지표를 나란히 보여 주어, 자신의 상황에 맞는 것을 고를 수 있게 합니다.
다섯 지표
- 글자 수(자소): 사람이 한 글자로 지각하는 것입니다. 👨👩👧 같은 이모지 가족이나 결합 악센트가 붙은 글자도 한 글자로 셉니다 — "눈으로" 세는 것과 일치하는 값입니다.
- 코드 포인트: 유니코드 스칼라 값의 수입니다. 눈에 보이는 한 글자가 여러 코드 포인트를 결합해 만들어질 수 있어, 이 수는 자소 수보다 큰 경우가 많습니다.
- UTF-16 단위: JavaScript가 문자열의 .length 속성으로 보고하는 값입니다. 기본 다국어 평면 밖의 문자(대부분의 이모지)는 저마다 UTF-16 단위 두 개를 차지합니다.
- 단어 수: 단어 같은 토큰의 수로, 단순히 공백으로 나누지 않고 유니코드를 고려해 감지합니다.
- 줄 수: 줄바꿈마다 센 줄의 수입니다.
이모지와 악센트가 순진한 세기를 깨뜨리는 이유
현대의 텍스트는 유니코드로 이루어지며, 유니코드는 많은 눈에 보이는 글자를 단일 단위가 아니라 나열로 나타냅니다. 국기 이모지는 두 개의 지역 표시 기호입니다. 가족 이모지는 보이지 않는 "폭 없는 결합자"로 이어진 여러 사람입니다. 악센트 붙은 é는 단일 코드 포인트일 수도, 맨 e에 결합 악센트가 이어진 것일 수도 있습니다. 모두 한 글자로 보이지만 지표에 따라 둘, 셋, 또는 그 이상으로 셉니다. 손으로 세거나 하나의 숫자를 믿으면 버그로 이어지는 이유가 바로 이것입니다.
어느 수를 써야 할까요?
- 사람이 보는 글자 수 제한(소개글, 트윗 같은 입력란, SMS 미리보기): 글자 수(자소)를 쓰세요. 사용자가 세는 것과 일치합니다.
- JavaScript의 문자열 처리, 배열 인덱싱이나 슬라이싱: UTF-16 단위를 쓰세요. .length와 문자열 인덱스가 그것에 기반합니다.
- 데이터베이스 열 크기: 열이 글자 단위인지 바이트 단위인지 확인하세요 — 많은 것이 바이트 제한이고, UTF-8 바이트 수는 이 어느 값과도 다릅니다.
- 편집기용 단어 수·줄 수, 가독성 지표: 단어 수와 줄 수 지표를 쓰세요.
자주 묻는 질문
- JavaScript의 문자열 길이에 일치하는 것은 어느 것인가요?
- UTF-16 단위 값이 JavaScript의 원시 .length 속성과 일치합니다. 코드가 문자열을 슬라이싱하거나 인덱싱한다면 그 동작을 좌우하는 것은 이 수입니다.
- 이모지 하나가 여러 글자로 세어지는 이유는 무엇인가요?
- 많은 이모지가 여러 유니코드 코드 포인트를 결합해 만들어집니다. 자소(보이는 것)로는 한 글자지만 코드 포인트 수와 UTF-16 단위 수는 그보다 큽니다. 각 지표를 나누어 보여 주는 이유가 그것입니다.
- 끝의 공백과 줄바꿈도 세나요?
- 네. 붙여넣은 모든 문자를 셉니다. 앞뒤 공백과 줄바꿈도 포함합니다. 합계가 예상보다 크면 눈에 보이지 않는 끝의 공백이 없는지 확인하세요.
- 입력한 텍스트가 어딘가로 전송되나요?
- 아니요. 세기는 모두 브라우저 안에서 이루어집니다. 입력하거나 붙여넣은 텍스트가 기기 밖으로 나가지 않습니다.
- 자소란 무엇인가요?
- 자소("자소 묶음")는 사람이 지각하는 글자입니다. 여러 하위 코드 포인트로 이루어져 있어도 읽는 사람이 한 글자라고 부를 최소 단위입니다.
- 바이트 수는 이 값들과 어떻게 다른가요?
- 바이트 수는 인코딩에 따라 달라집니다. UTF-8에서 ASCII 글자는 1바이트, 대부분의 악센트·비라틴 문자는 2~3바이트, 많은 이모지는 4바이트입니다. 여기 다섯 지표는 어느 것도 바이트 수가 아니므로, 바이트 제한이 있는 입력란에는 먼저 UTF-8로 인코딩하세요.