글자 수 카운터

이모지와 결합 문자가 섞인 문자열을 의미 있는 다섯 가지 지표로 동시에 측정합니다.

입력
글자 수
0
코드 포인트
0
UTF-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로 인코딩하세요.