90바이트는 몇 글자인가 — SMS·UTF-8·EUC-KR이 다 다른 이유
문자 90바이트가 몇 글자인지는 인코딩 방식에 따라 다릅니다. SMS는 한글 2바이트(EUC-KR)지만, 웹이나 DB는 3바이트(UTF-8)를 쓰는 이유와 각 시스템별 글자수 계산법을 알아봅니다.
한글 1글자는 2바이트? 3바이트? 둘 다 맞습니다
오래전 만들어진 SMS 시스템은 여전히 EUC-KR을 씁니다. 그래서 우리는 '한글은 2바이트'라는 말을 많이 들어온 것입니다. 하지만 우리가 쓰는 웹, 앱, 데이터베이스 등 거의 모든 현대 시스템은 UTF-8을 사용합니다. 그래서 개발자들은 '한글은 3바이트'라고 말하는 것입니다. 결국 어떤 환경에서 글자를 다루는지에 따라 기준이 달라집니다.
| 구분 | EUC-KR | UTF-8 |
|---|---|---|
| 한글 1글자 | 2 바이트 | 3 바이트 |
| 영문/숫자 1글자 | 1 바이트 | 1 바이트 |
| 이모지(😄) | 표현 불가 | 4 바이트 |
| 주 사용처 | 단문/장문 문자 메시지(SMS/LMS) | 웹사이트, 데이터베이스, 모든 최신 OS |
어디서 어떻게 다를까: SMS, X(트위터), 데이터베이스
실제 서비스들은 저마다 다른 규칙으로 글자 수를 셉니다. 가장 흔히 마주치는 세 가지 경우를 구체적으로 살펴보겠습니다.
- <strong>문자 메시지 (SMS/LMS)</strong>: 통신사는 EUC-KR 인코딩을 기준으로 바이트를 계산합니다. 단문 메시지(SMS)는 90바이트, 장문 메시지(LMS)는 2,000바이트가 기준입니다. 한글, 한자, 일본어, 전각 기호(·, ※ 등)는 모두 2바이트를 차지합니다. 영문, 숫자, 대부분의 특수문자, 공백은 1바이트입니다. '안녕하세요'는 10바이트, 'Hello'는 5바이트입니다.
- <strong>X (구 트위터)</strong>: X는 바이트가 아닌 자체적인 '가중치' 기준으로 글자 수를 셉니다. 최대 280까지 쓸 수 있습니다. 한글, 한자, 이모지는 한 글자당 '2'로 계산됩니다. 영문, 숫자는 '1'입니다. 가장 특이한 점은 URL(링크)입니다. 링크 주소의 길이에 상관없이 무조건 '23'으로 고정해서 계산합니다. 이는 X가 모든 링크를 자체 단축 서비스인 `t.co`로 변환하기 때문입니다.
- <strong>데이터베이스 (MySQL, Oracle 등)</strong>: `VARCHAR(100)` 같은 컬럼을 만들 때 가장 헷갈리는 부분입니다. DB 설정이 UTF-8이라면, 이 `100`은 100 '바이트'를 의미할 수 있습니다. 이 경우 한글(3바이트)은 약 33자밖에 저장하지 못합니다. 물론 `CHARSET` 설정이나 `NVARCHAR` 타입을 써서 100 '글자'를 보장하게 만들 수도 있지만, 기본적으로는 바이트 단위로 공간을 할당하는 경우가 많아 주의해야 합니다.
내 글의 정확한 바이트와 글자수 확인하기
<strong>SMS/LMS</strong>가 목적이라면 '길이 게이지' 섹션의 '단문 SMS', '장문 LMS'를 확인합니다. 이 게이지는 실제 문자 발송 기준인 EUC-KR(한글 2바이트)로 정확히 계산해서 90바이트나 2,000바이트를 넘는지 알려줍니다.
<strong>데이터베이스 `VARCHAR`</strong> 길이를 산정해야 한다면 상단의 통계표에서 '바이트 (UTF-8)' 값을 보면 됩니다. 이 값은 한글을 3바이트로 계산하므로 DB 컬럼 크기를 정할 때 기준이 됩니다.
<strong>X(트위터)</strong>에 글을 올릴 거라면 '트위터 / X' 게이지가 한글 2자, 영문 1자로 세는 가중치를 적용해 계산해 줍니다.
- Tools25의 <a href="/word-count">글자수 세기 도구</a>에 접속합니다.
- 텍스트 입력 칸에 확인하고 싶은 글을 붙여넣습니다.
- 결과가 실시간으로 계산되어 나옵니다. 여기서 목적에 맞는 값을 읽으면 됩니다.
눈으로 직접 보는 UTF-8 바이트의 모습
이처럼 '한'이라는 글자 하나가 세 덩어리의 코드로 변환되는 것을 보면 왜 UTF-8에서 한글이 3바이트인지 명확하게 이해할 수 있습니다. 같은 원리로 이모지(😂)를 입력하면 보통 4개의 바이트 코드로 변환됩니다.
# 텍스트 '한'을 UTF-8 16진수 바이트로 변환한 결과
한 → ED 95 9C
# 각 16진수 코드는 1바이트(8비트)를 의미함
ED = 11101101
95 = 10010101
9C = 10011100
자주 묻는 질문
왜 SMS는 아직도 낡은 EUC-KR 방식을 쓰나요?
문자 메시지 시스템(SMS/MMS)은 전 세계 통신사들이 수십 년 전에 구축한 아주 오래된 표준 인프라입니다. 당시에는 UTF-8이 표준이 아니었고, 각 나라 언어에 맞는 지역별 인코딩(한국은 EUC-KR)을 쓰는 것이 일반적이었습니다. 이 거대한 시스템 전체를 UTF-8로 바꾸는 데는 엄청난 비용과 호환성 문제가 따르기 때문에 아직도 과거의 표준이 그대로 유지되고 있습니다.
이모지는 몇 바이트인가요?
UTF-8 기준으로 대부분의 이모지는 4바이트를 차지합니다. 간혹 간단한 기호성 이모지(U+2600-U+27BF)는 3바이트인 경우도 있지만, 우리가 흔히 쓰는 얼굴 표정이나 사물 이모지는 거의 모두 4바이트입니다. 그래서 데이터베이스에 글자 수 제한이 빡빡한 경우, 이모지 하나가 한글보다 더 많은 공간을 차지할 수 있다는 점을 알아두는 것이 좋습니다.
데이터베이스에서 VARCHAR와 NVARCHAR는 다른가요?
네, 매우 다릅니다. `VARCHAR`는 DB의 기본 문자셋 설정(예: UTF-8)에 따라 바이트 단위로 공간을 할당하는 경우가 많습니다. 반면 `NVARCHAR`의 'N'은 National Character(국가별 문자)를 의미하며, 유니코드(UTF-8 등) 데이터를 저장하기 위해 만들어졌습니다. `NVARCHAR(100)`은 보통 100 '바이트'가 아닌 100 '글자'를 보장해 줍니다. 따라서 다국어를 저장해야 한다면 `NVARCHAR`를 쓰는 것이 훨씬 안전합니다.