The SMS character limit is 160 characters for a message written in the standard GSM-7 alphabet and 70 characters if the message uses Unicode (UCS-2), which happens as soon as it contains an emoji, a non-Latin script or certain accented letters. Longer messages are split into segments of 153 GSM-7 or 67 Unicode characters, and each segment is billed as one SMS.
You can paste any message into the free Unicode SMS checker to see its encoding, character count and number of parts before you send it. This guide explains where the limits come from, which characters cost double, why one emoji changes everything, and what each extra segment does to your bill.
Why is the SMS limit 160 characters?
An SMS carries at most 140 octets (bytes) of user data, as defined in 3GPP TS 23.040, the technical specification for the Short Message Service. How many characters fit into those 140 bytes depends on the encoding:
- GSM-7: each character uses 7 bits, so 140 × 8 ÷ 7 = 160 characters.
- UCS-2: each character uses 16 bits, so 140 ÷ 2 = 70 characters.
- 8-bit data: 140 bytes, used for binary content rather than text.
The encoding applies to the whole message. A single character that is not in the GSM-7 alphabet moves every character in the message to UCS-2.
Which characters are in the GSM-7 alphabet?
The GSM-7 default alphabet is defined in 3GPP TS 23.038. Its basic table of 128 characters includes:
- A to Z, a to z, 0 to 9, space and line break
- Common punctuation: ! ” # % & ‘ ( ) * + , – . / : ; < = > ? @ _
- Currency symbols £ $ ¥ and ¤
- Some accented letters: à é è ù ì ò É Ç Ä Ö Ñ Ü ä ö ñ ü Å å Ø ø Æ æ ß
- The Greek capitals Δ Φ Γ Λ Ω Π Ψ Σ Θ Ξ, plus § ¿ and ¡
Notably missing are á í ó ú â ê ô ã õ and a lower-case ç. A Portuguese or Spanish message that uses them, or any message in Greek lower case, Arabic, Cyrillic, Hindi or Chinese, is sent as Unicode.
Which characters count as two?
GSM-7 has a small extension table. Each of these characters is sent as an escape code followed by the character, so it uses two of your 160 positions:
| Character | Name | Counts as |
|---|---|---|
| € | Euro sign | 2 |
| [ ] | Square brackets | 2 each |
| { } | Curly brackets | 2 each |
| \ | Backslash | 2 |
| ^ | Caret | 2 |
| ~ | Tilde | 2 |
| | | Vertical bar | 2 |
The table also contains a form feed control character, which you are unlikely to send. In practice the euro sign is the one that catches European senders: a promotion that fits exactly with “10% off” can spill into a second segment when it becomes “€10 off”, as the examples below show. Most platforms also avoid splitting an escape code from its character across two parts, so a segment that would end on an extension character may carry 152 characters instead of 153.
Why does one emoji cut the limit to 70?
No emoji exists in GSM-7, so any emoji forces the entire message into UCS-2. The limit drops from 160 to 70 characters for a single SMS and from 153 to 67 per segment for longer ones.
Most emoji also take more than one position. UCS-2 slots are 16 bits wide, and emoji outside the original Unicode range are sent as a pair of 16-bit units (the UTF-16 encoding that handsets use in practice). Skin tones and joined sequences add more:
| Emoji | UCS-2 units used |
|---|---|
| Grinning face | 2 |
| Tick mark | 1 |
| Red heart (with variation selector) | 2 |
| Thumbs up with skin tone | 4 |
| Family of four (joined sequence) | 11 |
Emoji are not the only trigger. Characters that often slip in unnoticed when copy is pasted from a word processor, a design tool or a CMS include:
- Curly apostrophes and quotation marks (’ “ ”) instead of straight ones (‘ “)
- En and em dashes (– —) instead of a hyphen
- The ellipsis character (…) instead of three full stops
- Non-breaking and zero-width spaces, which are invisible on screen
The SMS.to checker’s detailed view highlights each character that forces Unicode and marks the ones where transcoding to a GSM-7 equivalent is possible, such as a curly apostrophe that could become a straight one.
Unicode is the right choice when your audience reads a non-Latin script. The aim is to use it on purpose, not by accident.
How many characters fit in a multipart SMS?
When a message exceeds a single SMS, it is sent as a concatenated SMS. Each part carries a 6-byte user data header (UDH) that tells the handset which message it belongs to, how many parts there are and where this one fits, as specified in TS 23.040. That header uses space in every part, which is why the per-segment limits are lower than the single-message limits:
| Segments | Max GSM-7 characters | Max UCS-2 characters |
|---|---|---|
| 1 | 160 | 70 |
| 2 | 306 | 134 |
| 3 | 459 | 201 |
| 4 | 612 | 268 |
| 5 | 765 | 335 |
| 6 | 918 | 402 |
The recipient sees one message, but you pay for every part. The 8-bit reference scheme allows up to 255 parts in theory; in practice, keep business messages to one or two segments, three at most. Long multipart messages are more exposed to parts arriving out of order or late on some networks, and some older handsets cap how many parts they reassemble.
Some networks and handsets also support national language shift tables defined in TS 23.038, for example for Turkish, Spanish and Portuguese, which let a few extra characters stay in 7-bit encoding. Support is uneven and the tables add their own header, so most international senders use Unicode for these languages. Ask your account manager before relying on them.
How do character limits change what you pay?
SMS is billed per segment, so the formula for any send is:
cost = price per segment × segments per message × recipients
Prices vary by destination; check the rate for each country on the SMS pricing page. The table below uses a hypothetical rate of $0.03 per segment to keep the maths readable. Characters is what you see on screen; units counted is what the network counts.
| Message | Encoding | Characters | Units counted | Segments | Cost for 10,000 recipients |
|---|---|---|---|---|---|
| Shipping update, plain text | GSM-7 | 99 | 99 | 1 | $300 |
| Same update with a tick emoji at the start | UCS-2 | 101 | 101 | 2 | $600 |
| Similar update with curly apostrophes pasted from a document | UCS-2 | 102 | 102 | 2 | $600 |
| One-time passcode | GSM-7 | 93 | 93 | 1 | $300 |
| Promotion without opt-out line | GSM-7 | 152 | 152 | 1 | $300 |
| Same promotion with “Reply STOP to opt out” added | GSM-7 | 174 | 174 | 2 | $600 |
| 160-character promotion with 10% off | GSM-7 | 160 | 160 | 1 | $300 |
| Same promotion with €10 off | GSM-7 | 160 | 161 | 2 | $600 |
| Short passcode in Greek | UCS-2 | 45 | 45 | 1 | $300 |
Three patterns cause most surprise bills:
- Compliance and sign-off lines. Adding “Reply STOP to opt out” to a 152-character promotion takes it to 174 and doubles the cost. Write the opt-out line into the template from the start.
- Personalisation. A template that fits with a short first name can tip into two segments with a long one. If 15% of a 100,000-contact list goes over, you pay for 115,000 segments instead of 100,000. Test with the longest value in your data.
- Long links. A full tracking URL can use 80 characters or more. A short link keeps the message in one part and still measures clicks.
How do you check a message before you send it?
For one-off campaigns, paste the final text, with real names and links filled in, into the SMS length calculator. It shows the encoding, characters used, characters remaining in the current part and the number of parts, and if you pick a destination country it shows the price per SMS and the total sending cost.
For messages generated by your application, call the estimate endpoint with the same body you would send. It returns the cost of the message without sending it, so a cost that doubles is an immediate sign that a template has grown into a second segment:
curl -X POST https://api.sms.to/sms/estimate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": "Your verification code is 482915. It expires in 5 minutes.",
"to": "+447700900123",
"sender_id": "SMSto"
}'
A simple rule for every template: set a segment budget (one segment for passcodes and alerts, one or two for marketing), check it with realistic data, and recheck whenever someone edits the copy. For the full sending flow, see how to integrate an SMS API.
How SMS.to handles long and Unicode messages
SMS.to is operated by Intergo Telecom, a licensed telecom operator. The platform supports both GSM-7 and Unicode, and messages longer than a single SMS are sent as concatenated parts with a UDH so the handset shows them as one. Pricing is per SMS part, per destination, and the SMS.to price list can be downloaded for every country. To keep messages inside your segment budget you can use:
- the SMS.to Unicode checker for encoding, parts and cost per destination;
- the estimate endpoint of the SMS API to check cost before each send;
- tracked short links, which save characters and report clicks.
When the content genuinely needs more room, consider Viber. A Viber business message can carry up to 1,000 characters plus an image and a button, and it counts as a single message; see Viber and SMS working together.
FAQs
Is the SMS character limit 160 or 140?
Both numbers are correct. An SMS carries 140 bytes of data, which holds 160 characters in 7-bit GSM-7 encoding or 70 characters in 16-bit Unicode (UCS-2).
Do spaces and line breaks count as characters?
Yes. Every space and line break counts as one character in GSM-7, and as one unit in Unicode.
How many characters does an emoji use?
Any emoji switches the whole message to Unicode, which lowers the limit to 70 characters. Most emoji then use two of those 70 positions, and emoji with skin tones or joined sequences use four or more.
Why was my 100-character message billed as two SMS?
It was almost certainly sent in Unicode. An emoji, a curly apostrophe or an accented letter outside GSM-7 lowers the single-SMS limit to 70 characters, so a 100-character message needs two parts.
Will the recipient see one message or several?
One. Handsets reassemble concatenated parts into a single message, but each part is billed separately.
Want to see the segment count and cost of your own messages? Create a free account, no credit card needed, and send your first test in minutes.