# QR character set reference — modes, values and indicators

> Alphanumeric mode covers exactly 45 characters with values 0–44. Digits 0–9 map to values 0–9, letters A–Z to 10–35, then space, $, %, *, +, -, ., / and : take 36–44. Lowercase letters are not in the set, so one lowercase character pushes the whole segment into byte mode.

Source: https://useqr.app/docs/reference/character-set-reference · Last reviewed 2026-08-21 · UseQR is free forever, MIT licensed, no signup.

---

## The alphanumeric table, values 0–44

Each character has a numeric value. Characters are taken in **pairs**: the pair encodes as
45 × (first value) + (second value), an 11-bit number. A trailing single character takes
6 bits alone.

| Value | Char | Value | Char | Value | Char |
|---|---|---|---|---|---|
| 0 | `0` | 15 | `F` | 30 | `U` |
| 1 | `1` | 16 | `G` | 31 | `V` |
| 2 | `2` | 17 | `H` | 32 | `W` |
| 3 | `3` | 18 | `I` | 33 | `X` |
| 4 | `4` | 19 | `J` | 34 | `Y` |
| 5 | `5` | 20 | `K` | 35 | `Z` |
| 6 | `6` | 21 | `L` | 36 | space |
| 7 | `7` | 22 | `M` | 37 | `$` |
| 8 | `8` | 23 | `N` | 38 | `%` |
| 9 | `9` | 24 | `O` | 39 | `*` |
| 10 | `A` | 25 | `P` | 40 | `+` |
| 11 | `B` | 26 | `Q` | 41 | `-` |
| 12 | `C` | 27 | `R` | 42 | `.` |
| 13 | `D` | 28 | `S` | 43 | `/` |
| 14 | `E` | 29 | `T` | 44 | `:` |

Worked example: `QR` = 45 × 27 + 28 = **1243** = `10011011011` in 11 bits.

Note what is **missing**: lowercase letters, `?`, `=`, `&`, `#`, `_`, `~` and `@`. A URL
with a query string cannot stay in alphanumeric mode past the first `=`, which is why
`HTTPS://EXAMPLE.COM/ABC` encodes ~31% smaller than its lowercase twin but a tracking URL
gains nothing. Details in [data encoding modes](/docs/spec/data-encoding-modes).

## Numeric mode

Digits `0-9` only. Groups of **3 digits → 10 bits**; a trailing pair takes 7 bits and a
trailing single digit 4 bits. That is 3.33 bits per digit against 8 in byte mode — the
reason a numeric-only payload reaches
[7,089 characters](/docs/reference/qr-code-capacity-table) while bytes stop at 2,953.
One stray character (a `+` before a phone number, a space) disqualifies the whole segment.

## Byte mode

8 bits per byte, any value. The ISO/IEC 18004 default interpretation is **ISO 8859-1**
(Latin-1), but near-universal practice is to store **UTF-8** and rely on the decoder to
detect it — every mainstream phone does. A strictly conforming encoder would announce UTF-8
with an [ECI](/glossary/eci) header, yet ECI itself confuses some older readers, so most
generators (UseQR included) write plain UTF-8 bytes with no ECI. See
[UTF-8 and Unicode in QR codes](/docs/spec/utf-8-and-unicode-in-qr-codes).

## Kanji mode

13 bits per character, for double-byte Shift-JIS characters in the ranges **0x8140–0x9FFC**
and **0xE040–0xEBBF**. A compaction of Shift-JIS, not of Unicode — see
[kanji mode explained](/docs/spec/kanji-mode-explained).

## Mode indicators and count field widths

Every segment starts with a 4-bit mode indicator, then a character count whose width depends
on the version:

| Mode | Indicator | Count bits v1–9 | v10–26 | v27–40 |
|---|---|---|---|---|
| Numeric | `0001` | 10 | 12 | 14 |
| Alphanumeric | `0010` | 9 | 11 | 13 |
| Byte | `0100` | 8 | 16 | 16 |
| Kanji | `1000` | 8 | 10 | 12 |
| ECI | `0111` | — | — | — |
| Structured append | `0011` | — | — | — |
| Terminator | `0000` | — | — | — |

A single code may switch modes mid-stream — encoders segment the input and use the cheapest
mode for each run. To see which mode a real code ended up in,
[decode it](/validate) and read the reported mode, or start from a
[plain text code](/text-qr-code) and vary the characters.

## FAQ

### What characters can a QR code contain?
Anything — byte mode stores arbitrary 8-bit data, in practice UTF-8, so all of Unicode is representable. The numeric and alphanumeric modes are optimisations for restricted character sets, not limits on what QR codes can hold.

### Does a QR code support lowercase letters?
Yes, via byte mode at 8 bits per character. Only the 45-character alphanumeric set — digits, uppercase A–Z and nine symbols — qualifies for the cheaper 5.5-bit encoding.

### What is the QR alphanumeric character set?
Exactly 45 characters: 0–9 (values 0–9), A–Z (10–35), space (36), then $, %, *, +, -, ., / and : (37–44). Pairs encode as 45 × first + second in 11 bits.

### Why does an uppercase URL make a smaller QR code?
Uppercase letters sit in the alphanumeric set, so the segment encodes at 5.5 bits per character instead of 8. Schemes and hostnames are case-insensitive, making HTTPS://EXAMPLE.COM safe; paths are frequently case-sensitive, so leave them alone.

## Try it

- https://useqr.app/validate
- https://useqr.app/url
- https://useqr.app/text
