문자열 길이 계산기
문자열을 붙여넣으면 이 도구는 그 길이를 네 가지 방식으로 알려줍니다: 자바스크립트 스타일의 .length(UTF-16 코드 단위), 유니코드 코드 포인트, 그래핌 클러스터(사용자가 한 글자로 인식하는 단위), 그리고 데이터베이스 열에 실제로 저장되는 UTF-8 바이트입니다. 이모지, 국기, 결합 기호가 포함된 문자열에서는 이 수치들이 서로 일치하지 않으며, 바로 이 불일치가 수많은 버그의 원인이 됩니다.
문자열 길이의 네 가지 의미
-
1
UTF-16 코드 단위
`str.length`가 자바스크립트에서 반환하는 값입니다. 대부분의 문자에는 1이, U+FFFF를 초과하는 모든 코드 포인트(에모지, 고대 문자 체계 등)에는 2가 반환됩니다.
-
2
코드 포인트
유니코드 스칼라당 하나씩입니다. 이모지는 각각 하나이며, ZWJ 시퀀스는 여러 개입니다.
-
3
그래핌 클러스터
사용자가 ‘한 글자’라고 부르는 것과 같습니다. `🇺🇸`은 코드 포인트가 2개이지만 그래핌은 1개이며, `n̈` 역시 코드 포인트는 2개이지만 그래핌은 1개입니다.
-
4
UTF-8 바이트
데이터베이스에 저장되는 데이터입니다. ASCII는 각각 1바이트, 일반 유럽 문자는 2바이트, CJK는 3바이트, 대부분의 이모티콘은 4바이트입니다.
예시
| 문자열 | JS .length | 코드 포인트 | 그래핌 | UTF-8 바이트 |
|---|---|---|---|---|
hello |
5 | 5 | 5 | 5 |
café |
4 | 4 | 4 | 5 |
😀 |
2 | 1 | 1 | 4 |
🇺🇸 |
4 | 2 | 1 | 8 |
👨👩👧 (가족) |
8 | 5 | 1 | 18 |
n̈ (n + 분음 기호) |
2 | 2 | 1 | 3 |
수치가 다른 이유
JavaScript 문자열은 UTF-16 형식을 사용하므로, U+FFFF를 넘는 코드 포인트는 서로게이트 쌍(두 개의 UTF-16 코드 단위)으로 저장됩니다. 그래서 "😀".length === 2가 됩니다. 사용자들은 😀를 한 글자로 여기기 때문에 이 동작을 싫어합니다.
그래핌은 한 걸음 더 나아갑니다. 국기는 지역을 나타내는 두 개의 코드 포인트로 구성되지만, 사용자는 이를 하나의 국기로 인식합니다. 자바스크립트에서는 "🇺🇸".length === 4가 되는데, 다소 황당하게 느껴지지만 실제로 그렇습니다. 그래핌 단위로 순회하려면 Intl.Segmenter(최신 방식), grapheme-splitter 라이브러리를 사용하거나 직접 처리해야 합니다.
UTF-8 바이트: 데이터베이스가 저장하는 값
열 타입이 VARCHAR(255)인 경우:
- MySQL
utf8(실제로는 utf8mb3)에서 255는 바이트 수입니다.café는 5바이트를 사용하므로 51개를 저장할 수 있습니다. - MySQL
utf8mb4(이모지를 포함하는 진짜 UTF-8)에서도 여전히 바이트 단위이지만, 인코딩이 4바이트 시퀀스를 지원합니다. - Postgres
VARCHAR(255)에서 255는 바이트가 아니라 문자(코드 포인트) 수입니다. - SQL Server
VARCHAR에서는 정렬 규칙(collation)에 따라 달라지며,NVARCHAR는 2바이트 UCS-2 단위로 셉니다.
데이터베이스 필드 크기를 사용자에게 보이는 문자 수 기준으로 정한다면, UTF-8 열에서는 안전을 위해 바이트 수에 4를 곱해 잡으세요. 각 그래핌은 코드 포인트당 최대 4바이트를 차지할 수 있고, ZWJ 시퀀스는 그보다 더 많은 공간을 사용합니다.
트위터 방식의 문자 수 계산
트위터는 트윗을 자체 규칙으로 셉니다. 기본은 코드 포인트이지만, 이모지와 CJK(한중일) 표의 문자는 각각 2로 계산됩니다. 100% ASCII 트윗은 최대 280자까지 입력할 수 있지만, 이모지를 140개 넣은 트윗은 140 “자”가 한계입니다.
SMS 문자 수: GSM 7비트에서는 160자입니다. GSM에 없는 문자(á, é, ñ, 이모지)가 하나라도 들어가면 인코딩이 UCS-2로 바뀌고, 메시지 길이는 70자로 줄어듭니다.
실용적인 활용
- 데이터베이스 열 크기 설정, 마이그레이션을 작성하기 전에 바이트 수를 확인하세요.
- API 할당량 적용, 대부분의 API는 문자가 아니라 바이트를 셉니다.
- 폼 유효성 검사, 사용자의 기대(그래핌)와 일치하는 정확한 문자 수를 보여 줍니다.
- 성능 디버깅, 이 정규식이 왜 이렇게 느리게 도는 걸까요? 입력이 그래핌 단위보다 코드 단위로 3배 더 길기 때문입니다.
자주 묻는 질문
그 이모지는 여러 코드 포인트를 결합한 ZWJ 시퀀스입니다(예: 가족 이모지는 7개의 코드 포인트로 구성됨). 트위터는 유니코드 가중치 규칙에 따라 이를 2자로 계산하지만, 편집기에서는 1 그래핌으로 표시됩니다. 두 방식 모두 기술적으로 옳으며, 단지 측정하는 대상이 다를 뿐입니다.
UTF-8 데이터베이스에서는 안전을 위해 예상 문자 하나당 4바이트를 잡으세요. 100자(그래핌) 필드는 VARCHAR(400) 바이트로 잡아야 하며, Postgres처럼 문자 단위로 세는 데이터베이스라면 적절한 문자 집합 설정과 함께 VARCHAR(100)을 사용하면 됩니다.
자바스크립트에서는 정규화 형태에 따라 달라집니다. NFC로 결합된 문자(U+00E1)의 길이는 1이고, NFD로 분해된 문자(U+0061 + U+0301)의 길이는 2입니다. 보이는 문자는 같지만 바이트 시퀀스가 다릅니다.
가족과 직업 이모지는 긴 ZWJ 시퀀스로 이루어져 있습니다. 이를 완전히 지원하지 않는 폰트는 각 코드 포인트를 별도의 글리프로 렌더링하므로, 예를 들어 👨💻가 👨+💻로 갈라집니다. 운영체제 폰트를 업그레이드하면 해결됩니다.
관련 도구
도시 이름 생성기
세계관, 지도, 게임, 이야기, 목업 데이터에 쓸 가상 도시, 마을, 촌락, 수도 이름을 만들고 각 결과에 짧은 메모를 제공합니다.
스크롤 텍스트 생성기
변경 가능한 속도, 글꼴 크기 및 색상을 사용하여 애니메이션 스크롤 헤드라인을 생성하세요. 브라우저에서 CSS 마퀴 티커나 공지 바를 실시간으로 미리 보세요.
애너그램 생성기
짧은 단어를 입력하면 중복 순열을 제거하고 표시 개수를 조절해 글자의 고유한 재배열을 확인할 수 있습니다.
소름 텍스트 생성기
유니코드 결합 기호를 사용해 일반 텍스트를 소름 끼치는 잘고 / 글리치 텍스트로 바꿉니다. 강도 조절 가능. SNS, Discord 및 대부분의 폰트에서 작동합니다.
무작위 프랑스 이름 생성기
40개 이름과 40개 성의 고정 목록에서 두 부분으로 된 프랑스 이름 아이디어를 1~50개 만듭니다.
이모지 번역기
영어 텍스트를 입력하면 내장 목록에 있는 단어마다 어울리는 이모지가 붙습니다. 이모지가 포함된 텍스트로 복사할 수 있습니다.
이 도구는 다른 언어로도 제공됩니다
- Calculateur de longueur de chaîne [FR]
- مقياس طول السلسلة النصية [AR]
- Kalkulator Panjang String [ID]
- Stringlengteberekenaar [NL]
- Calculadora de Longitud de Cadenas [ES]
- Zeichenlängenrechner [DE]
- Kalkulator długości ciągu znaków [PL]
- Stränglängdsberäknare [SV]
- เครื่องคำนวณความยาวของสตริง [TH]
- 文字列長計算ツール [JA]
- Công cụ tính chiều dài chuỗi ký tự [VI]
- Calculadora de Comprimento de String [PT]
- Dize Uzunluğu Hesaplayıcı [TR]
- 字符串长度计算器 [ZH]
- String Length Calculator [EN]
- Calcolatore della lunghezza della stringa [IT]
- Калькулятор длины строки [RU]