This post is about Korean text. In Korea a text message is a short message (SMS) up to 90 bytes, and a longer one is a long message (LMS). Most people have heard “90 bytes”, but few can say how many Korean characters that is. Hangul takes 2 bytes per character, while English letters, digits and spaces take 1 byte, so mixed text fits much more, and a single emoji can change the result. Below are the counting rules the Geuljasu byte counter uses and the values we got by running it.
How the 90 bytes are counted
The byte size of a character depends on the character encoding. For Korean text messages the usual reference is EUC-KR. On the web the encoding is UTF-8, and a Hangul character has a different size in each.
| Character type | EUC-KR (approx.) | UTF-8 |
|---|---|---|
| English letters, digits, spaces, basic symbols | 1 byte | 1 byte |
| One Hangul character | 2 bytes | 3 bytes |
| Chinese characters, kana, emoji and others | 2 bytes (approx.) | varies by character (about 4 bytes for emoji) |
Geuljasu counts English letters and digits as 1 byte and every other character as 2 bytes, and shows this as the “EUC-KR approximation”. A result of 90 or less is a short message, and 2,000 or less is a long message. Characters that EUC-KR cannot represent, such as emoji, are also counted as 2 bytes. Because this is an approximation, check the rules of your carrier or sending provider for the real limit.
The same 90 bytes, different character counts
45 Hangul characters are exactly 90 bytes in EUC-KR, and the 46th character makes it 92 bytes, which turns the message into a long message. A message made only of English letters and digits reaches 90 bytes at 90 characters. So the same 90 bytes can hold anywhere from 30 to 90 characters depending on what you write. If you only remember “up to 45 characters”, the count goes wrong as soon as real text with digits is involved.
Calculating with real messages
These values come from the Geuljasu calculation function. The Korean sentences are the actual input, with an English gloss in brackets.
| Message | Characters | EUC-KR approx. | UTF-8 | Type |
|---|---|---|---|---|
| [배송] 주문하신 상품이 오늘 출고되었습니다. 운송장 1234567890 (Your order shipped today, tracking number included) | 40 | 61 bytes | 82 bytes | Short |
| Your verification code is 482915. Valid for 3 minutes. | 54 | 54 bytes | 54 bytes | Short |
| [글자수닷컴] 안녕하세요, 예약하신 상담이 내일 오후 3시로 확정되었습니다. 방문 전 연락 부탁드립니다. (Your appointment is confirmed for 3 PM tomorrow; please call before you visit) | 58 | 99 bytes | 140 bytes | Long |
The third notice is only 58 characters, but at 99 bytes it is 9 bytes over, so it becomes a long message. Cut at 90 bytes without splitting a character, it keeps 53 characters and ends at ”…방문 전 연락 부탁” (the end of “please call before you visit”). An emoji changes things too: the Korean greeting “안녕하세요 😀” is 7 characters but 13 bytes in the EUC-KR approximation.
Short or long message: how it is decided
From 91 bytes a message is a long message, and the tool treats up to 2,000 bytes as long. For Hangul only that is roughly 1,000 characters. Many services charge differently for short and long messages, so first check whether a small cut gets you to 90 bytes.
Code to check it yourself
Paste this in a browser console to see the bytes and type of a message. It follows the same approximation rule as the Geuljasu byte counter.
// EUC-KR approximation: ASCII is 1 byte, everything else 2 bytes
function smsBytes(text) {
let eucKr = 0;
for (const ch of text) eucKr += ch.codePointAt(0) < 0x80 ? 1 : 2;
const utf8 = new TextEncoder().encode(text).length;
return { eucKr, utf8, kind: eucKr <= 90 ? 'short' : eucKr <= 2000 ? 'long' : 'too long' };
}
smsBytes('[배송] 주문하신 상품이 오늘 출고되었습니다. 운송장 1234567890');
What to check when trimming
- Spaces and line breaks are bytes too. A line break counts as 1 byte, so a message split into many lines fills up faster than you expect.
- Parentheses, brackets and periods are 1 byte, but full-width symbols (such as 「」 or ※) are counted as 2 bytes.
- Text the sending service inserts automatically (an ad label, an opt-out notice) may be added on top, so a message that fits exactly 90 bytes can overflow. Leave a few bytes of margin.
- Avoid emoji if you can. They are 2 bytes even in the approximation, and real sending rules can differ by device and service.
To paste a message and cut it to 90 bytes, use the Byte Counter. To see counts with and without spaces and the other measures at once, use the Word Counter.