# The GSM-7 character set

> GSM-7 is the 7-bit default alphabet defined in GSM 03.38 (3GPP TS 23.038) for SMS. It encodes 128 characters — Latin letters, digits, punctuation and a few accented and Greek characters — in 7 bits each. Ten extra characters live in an extension table and each cost two septets. Text fits 160 characters per single SMS.

- Canonical URL: https://www.broadnet.me/reference/gsm7-character-set
- Language: en
- Last updated: 2026-07-18
- Publisher: BroadNet (https://www.broadnet.me)

The full GSM 7-bit default alphabet from GSM 03.38: the basic 128-character table, the escape-based extension table (| ^ € { } [ ] ~ \ and form-feed), and how 7-bit packing works.

## The basic table (128 characters)

The GSM-7 default alphabet packs 128 characters into 7 bits each. It covers the uppercase Latin alphabet, digits, common punctuation, a set of accented Latin vowels, the section and currency signs, and several uppercase Greek letters used as symbols. Every character here costs exactly one septet (7 bits).

*GSM-7 basic alphabet (by group)*

| Group | Characters |
|---|---|
| Latin uppercase | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
| Latin lowercase | a b c d e f g h i j k l m n o p q r s t u v w x y z |
| Digits | 0 1 2 3 4 5 6 7 8 9 |
| Punctuation | ! " # % & ' ( ) * + , - . / : ; < = > ? _ |
| Accented Latin | à ä å æ è é ì ñ ò ö ø ù ü Ä Å Æ Ç É Ñ Ö Ø Ü ß |
| Greek symbols | Δ Φ Γ Λ Ω Π Ψ Σ Θ Ξ |
| Currency / signs | £ $ ¥ ¤ € (ext) § ¡ ¿ @ |
| Whitespace | SP (space), CR, LF |

## The extension table

Ten characters are not in the basic table. They are reached with an escape prefix (0x1B) followed by the character's code in the extension table, which means each of these costs two septets, not one. Including any of them in a message reduces the effective single-SMS capacity. Note that the Euro sign (€) is one of them.

*GSM-7 extension table — each costs 2 septets*

| Character | Name |
|---|---|
| \| | Vertical bar |
| ^ | Caret / circumflex |
| € | Euro sign |
| { | Left curly brace |
| } | Right curly brace |
| [ | Left square bracket |
| ] | Right square bracket |
| ~ | Tilde |
| \ | Backslash |
| FF | Form feed |

## 7-bit packing

Because each character is 7 bits but octets are 8 bits, GSM-7 packs septets across byte boundaries. Eight 7-bit characters pack into seven 8-bit octets, so 160 septets fill 140 octets — the SMS user-data limit. The packing shifts each successive character's bits to fill the gaps, which is why a naive byte-per-character view of a GSM-7 SMS looks scrambled.

*Septet packing — 160 septets → 140 octets*

```text
8 characters (56 bits) ────► 7 octets (56 bits)
160 GSM-7 septets       ────► 140 octets (the SMS payload limit)
                              (an extension char = 2 septets)
```

## Language shift tables

3GPP TS 23.038 also defines national language shift tables (for example Turkish, Spanish, Portuguese) that remap some extension-table positions to language-specific letters. Support is patchy across handsets and networks, so many senders avoid relying on them and fall back to UCS-2 when a message needs characters outside the basic GSM-7 set.

## Frequently asked questions

### How many characters fit in a GSM-7 SMS?

160 characters in a single SMS, because 160 septets of 7 bits each fill the 140-octet user-data limit. Concatenated GSM-7 messages drop to 153 characters per segment to make room for the User Data Header.

### Which characters count as two in GSM-7?

The ten extension-table characters — | ^ € { } [ ] ~ \ and form-feed — each cost two septets because they need an escape prefix. Using any of them reduces how much text fits in a single SMS.

### Is the Euro sign in GSM-7?

Yes, but in the extension table, so it costs two septets rather than one. A message containing € therefore fits fewer characters before it needs a second segment.

### Why does a GSM-7 message look scrambled at byte level?

Because GSM-7 packs 7-bit characters across 8-bit octet boundaries. Eight characters occupy seven octets, so reading the payload one byte per character gives nonsense — you must unpack the septets first.

### What happens if my text has a character not in GSM-7?

The whole message must switch to UCS-2 (16-bit) encoding, which drops the single-SMS capacity from 160 to 70 characters. A single non-GSM-7 character (an emoji, curly quote or many non-Latin letters) forces this.

## Sources

- [3GPP TS 23.038 — alphabets and language-specific info](https://www.3gpp.org/dynareport/23038.htm)
- [3GPP TS 23.040 — SMS technical realization](https://www.3gpp.org/dynareport/23040.htm)

## Related

- [UCS-2 and Unicode SMS](https://www.broadnet.me/reference/ucs2-unicode-sms)
- [Encoding detection & cost](https://www.broadnet.me/reference/encoding-detection-and-cost)
- [GSM-7 / Unicode checker (free tool)](https://www.broadnet.me/tools/gsm7-unicode-checker)
- [What is GSM-7?](https://www.broadnet.me/answers/what-is-gsm-7)
- [SMS segment calculator (free tool)](https://www.broadnet.me/tools/sms-segment-calculator)
