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
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.
Characters to replace
Replacing 3 characters gives GSM-7, 115 septets and 1 segment instead of 2 segments.
Every character is in the GSM-7 alphabet, so there is nothing to replace.
| Character | Code point | Times | Replace with |
|---|---|---|---|
| – | U+2013 | 1 | - |
| ’ | U+2019 | 2 | ' |
SMS limits by encoding
| Encoding | Unit | One message | Each segment of a longer message |
|---|---|---|---|
| GSM-7 | Septet (7 bits) | 160 | 153 |
| UCS-2 | UTF-16 code unit (16 bits) | 70 | 67 |
Characters allowed for 1 to 6 segments
| Segments | GSM-7 septets | UCS-2 code units |
|---|---|---|
| 1 | 160 | 70 |
| 2 | 306 | 134 |
| 3 | 459 | 201 |
| 4 | 612 | 268 |
| 5 | 765 | 335 |
| 6 | 918 | 402 |
GSM-7 extension characters
| Character | Septets | Bytes sent (hex) | Cost of 10 in a row |
|---|---|---|---|
| (form feed) | 2 | 1B 0A | 20 septets |
| ^ | 2 | 1B 14 | 20 septets |
| { | 2 | 1B 28 | 20 septets |
| } | 2 | 1B 29 | 20 septets |
| \ | 2 | 1B 2F | 20 septets |
| [ | 2 | 1B 3C | 20 septets |
| ~ | 2 | 1B 3D | 20 septets |
| ] | 2 | 1B 3E | 20 septets |
| | | 2 | 1B 40 | 20 septets |
| € | 2 | 1B 65 | 20 septets |
Characters that force UCS-2, and what to use instead
| Character | Code point | Replace 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+00E1 | a |
| ê | U+00EA | e |
| ç | U+00E7 | c |
| ł | U+0142 | l |
| ✓ | U+2713 | No GSM-7 equivalent: remove it, or accept UCS-2 |
| 😀 | U+1F600 | No GSM-7 equivalent: remove it, or accept UCS-2 |
| ש | U+05E9 | No GSM-7 equivalent: remove it, or accept UCS-2 |
The GSM-7 default alphabet
| Septets (hex) | Characters |
|---|---|
| 00 to 0F | @ £ $ ¥ è é ù ì ò Ç LF Ø ø CR Å å |
| 10 to 1F | Δ _ Φ Γ Λ Ω Π Ψ Σ Θ Ξ ESC Æ æ ß É |
| 20 to 2F | space ! " # ¤ % & ' ( ) * + , - . / |
| 30 to 3F | 0 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 5F | P 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 7F | p q r s t u v w x y z ä ö ñ ü à |
How to count SMS segments
- Paste your message. Type or paste it into the box, replacing the example. Counts update as you type.
- 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.
- 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.
- 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.
- 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
- 3GPP TS 23.038: Alphabets and language-specific information (GSM 03.38), clause 6.2 on the 7-bit default alphabet and extension table
- 3GPP TS 23.040: Technical realization of the Short Message Service (SMS), clause 9.2.3.24.1 on concatenated short messages
- RFC 2781: UTF-16, an encoding of ISO 10646 (surrogate pairs)
More free tools
- Word CounterCount words, characters, sentences and reading time, and check your text against X, LinkedIn, Instagram, SMS and meta description limits.
- Text to Binary ConverterConvert text to binary, hex, octal or decimal bytes and back. UTF-8 by default (é is 2 bytes, an emoji 4) or UTF-16, with a per-character breakdown.
- Morse Code TranslatorTranslate text to Morse code and back, with audio at any WPM (Farnsworth too) and a full ITU-R M.1677-1 chart with punctuation, @ and SOS.
- Case ConverterConvert text to UPPERCASE, lowercase, Title Case, Sentence case, camelCase, PascalCase, snake_case, kebab-case or CONSTANT_CASE. Stays in your browser.
- Remove Duplicate LinesRemove duplicate lines from a list, keep the first or last copy, and sort A to Z, naturally or at random. Works in any language and stays in your browser.
- Text CompareCompare two texts and see what changed, line by line with changed words highlighted. Ignore case or spacing, copy a unified diff. Stays in your browser.