Skip to main content
ponderloop

SMS Character Counter

A text message holds 160 characters in plain GSM-7 or 70 if any character forces UCS-2, and a longer message is split into segments of 153 or 67. Extension characters (€ [ ] { } \ ^ ~ |) count as 2. The example below has 114 characters, but – ’ switch it to UCS-2, so it takes 2 segments; made GSM-friendly it is 115 septets and 1 segment. Nothing leaves your browser.

Updated Runs in your browser: nothing you enter is uploadedHow this tool works

Stays in your browser

Your message is processed on this device and never uploaded. It is not saved either: reload the page and it is gone.

Segments

Segments
2
Encoding
UCS-2 (UTF-16)
Characters
114
UTF-16 units
114

Segment 2 of 2: 47 of 67 UTF-16 units used, 20 left before segment 3.

2 distinct characters outside GSM-7 force the whole message into UCS-2, where each character takes 2 bytes and an emoji takes 4.

Your message, with the problem characters marked

Red characters force UCS-2. Dotted characters are GSM-7 extension characters and take 2 septets.

Hi Sam – your table for two is booked for 7 pm tonight. Don’t be late, we’ll hold it for 15 minutes. Deposit: €10.

Characters to replace

Replacing 3 characters gives GSM-7, 115 septets and 1 segment instead of 2 segments.

CharacterCode pointTimesReplace with
–U+20131-
’U+20192'

SMS limits by encoding

A message that fits in one piece uses the single limit. Longer ones lose 6 bytes per segment to the concatenation header.
EncodingUnitOne messageEach segment of a longer message
GSM-7Septet (7 bits)160153
UCS-2UTF-16 code unit (16 bits)7067

Characters allowed for 1 to 6 segments

Maximum units (septets or UTF-16 code units) for a message of that many segments. An emoji is 2 UTF-16 units; an extension character is 2 septets.
SegmentsGSM-7 septetsUCS-2 code units
116070
2306134
3459201
4612268
5765335
6918402

GSM-7 extension characters

Each is sent as the escape septet 1B followed by a second septet, so it takes 2 of the 160 (or 153) slots. Computed from the 3GPP table.
CharacterSeptetsBytes sent (hex)Cost of 10 in a row
(form feed)21B 0A20 septets
^21B 1420 septets
{21B 2820 septets
}21B 2920 septets
\21B 2F20 septets
[21B 3C20 septets
~21B 3D20 septets
]21B 3E20 septets
|21B 4020 septets
€21B 6520 septets

Characters that force UCS-2, and what to use instead

One of these anywhere in the message switches every character to 2 bytes. The same replacements drive the “Make GSM-friendly” button.
CharacterCode pointReplace with
’U+2019'
‘U+2018'
“U+201C"
”U+201D"
–U+2013-
—U+2014-
…U+2026...
(no-break space)U+00A0(a normal space)
•U+2022*
`U+0060'
áU+00E1a
êU+00EAe
çU+00E7c
łU+0142l
✓U+2713No GSM-7 equivalent: remove it, or accept UCS-2
😀U+1F600No GSM-7 equivalent: remove it, or accept UCS-2
שU+05E9No GSM-7 equivalent: remove it, or accept UCS-2

The GSM-7 default alphabet

Septets 00 to 7F from 3GPP TS 23.038, one per slot (LF is a line feed, CR a carriage return, ESC the escape to the extension table).
Septets (hex)Characters
00 to 0F@ £ $ ¥ è é ù ì ò Ç LF Ø ø CR Å å
10 to 1FΔ _ Φ Γ Λ Ω Π Ψ Σ Θ Ξ ESC Æ æ ß É
20 to 2Fspace ! " # ¤ % & ' ( ) * + , - . /
30 to 3F0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 to 4F¡ A B C D E F G H I J K L M N O
50 to 5FP Q R S T U V W X Y Z Ä Ö Ñ Ü §
60 to 6F¿ a b c d e f g h i j k l m n o
70 to 7Fp q r s t u v w x y z ä ö ñ ü à

How to count SMS segments

  1. Paste your message. Type or paste it into the box, replacing the example. Counts update as you type.
  2. Read the segment count. The big number is how many messages the text is sent as. Below it you see the encoding (GSM-7 or UCS-2) and how many characters of the current segment are used and left.
  3. Find what forces UCS-2. In the highlighted preview, characters outside GSM-7 are marked. The list beneath names each one with a “replace with” suggestion, such as a straight apostrophe for a curly one.
  4. Make it GSM-friendly. Press “Make GSM-friendly” to apply every suggestion at once. If the result is wrong, Undo restores your text. Characters with no equivalent, such as emoji, stay.
  5. Copy the text into your SMS tool. Select the text in the box and copy it. The tool never uploads or stores your message.

Frequently asked questions

How many characters is one SMS?
A single SMS holds 160 characters in GSM-7 or 70 in UCS-2. When the message is longer it is sent as several segments, each carrying a 6-byte header, so a segment holds 153 GSM-7 characters or 67 UCS-2 characters.
What is GSM-7?
GSM-7 is the 7-bit default alphabet of 3GPP TS 23.038 (formerly GSM 03.38): basic Latin letters, digits, common punctuation, some accented letters (é è ù ì ò à ä ö ñ ü Å å Ø ø Æ æ É Ç ß), a few Greek capitals and currency signs (£ $ ¥ ¤). A message made only of these characters is packed 7 bits per character.
Why do some characters count as two?
The 128-slot alphabet has no room for everything, so € [ ] { } \ ^ ~ | and the form feed live in an extension table. They are sent as an escape septet plus a second septet, so each takes 2 of the 160 slots. Phones are expected to keep that pair together within one segment.
What switches a message to UCS-2?
Any single character outside GSM-7: curly quotes, an en or em dash, an ellipsis character, a non-breaking space, lowercase accented letters such as á or ç, any emoji, and any non-Latin script. The whole message is then sent as UCS-2 (UTF-16), so every character takes 2 bytes and the limit drops from 160 to 70.
Why did my message get so much shorter after one emoji?
Because the encoding is chosen for the message as a whole, not per character. One emoji means 70 characters per message instead of 160, and the emoji itself takes 2 UTF-16 units (a surrogate pair). A 100-character message with one emoji is 2 segments; without it, 1.
What happens when an emoji falls on a segment boundary?
This counter keeps the pair together and moves it to the next segment, so a segment may hold 66 units instead of 67. Some carriers instead cut the pair across two messages, which can use fewer segments but shows a broken character if the phone decodes the halves separately. When the two methods differ, the tool tells you.
Does the segment count affect what I pay?
Most SMS providers bill per segment, so a message of 2 segments costs about twice a single one. Your provider’s own counter is the final word, since carriers differ in details such as how they treat line breaks and unusual characters.
Can I make my text GSM-friendly without losing meaning?
Usually. Curly quotes become straight quotes, en and em dashes become hyphens, the ellipsis becomes three dots, a non-breaking space becomes a normal space, and accents GSM-7 lacks are dropped (ç becomes c). Emoji and non-Latin scripts have no equivalent: keep them and accept UCS-2, or rewrite the message.
Is my message sent anywhere?
No. Counting runs in your browser and nothing is uploaded or stored; reload the page and the text is gone. The only thing the site records, if you allow analytics, is that a button was used, never any of the text.

How it works

Each character (Unicode code point) is looked up in the GSM-7 default alphabet and extension table of 3GPP TS 23.038, clause 6.2.1. Basic characters cost 1 septet and extension characters 2 (an escape plus a character). If every character is found the message is GSM-7; one miss makes it UCS-2, counted in UTF-16 code units, where a character above U+FFFF (most emoji) is a surrogate pair of 2. A message of at most 160 septets or 70 units is one segment. A longer one is concatenated as described in 3GPP TS 23.040 (clause 9.2.3.24.1): a 6-byte user-data header leaves 153 septets or 67 units per segment, and characters are packed into segments without ever cutting an escape pair or a surrogate pair, the usual behaviour of phones and gateways. The segment count assumes the text is sent as written. Line breaks are counted as one character (a line feed). Some carriers or providers add a signature, convert some characters themselves or use national language shift tables, which change the count; check with yours for billing. “Replace with” suggestions use a fixed table for punctuation, then Unicode compatibility decomposition (NFKD) with the accent marks removed, and offer a replacement only when the result is entirely GSM-7. Invisible joiners and direction marks are removed only when nothing else in the message forces UCS-2.

Sources

All toolsHome & DIY calculators