De fire hovedmodusene
Hver modus veier tegnutvalg mot tetthet. Numerisk modus håndterer bare sifre, men pakker tre av dem inn i 10 biter, mens bytemodus håndterer hvilken som helst byte, men bruker 8 biter på hver.
Alfanumerisk modus dekker et tegnsett på 45 tegn: sifrene 0–9, de store bokstavene A–Z, mellomrom og symbolene $ % * + - . / og kolon. Små bokstaver er ikke med i settet, og det er grunnen til at en URL med bare store bokstaver kan gi en mindre kode enn den samme URL-en med små bokstaver.
- Numerisk: sifrene 0–9, 10 biter per 3 sifre
- Alfanumerisk: 45 tegn, 11 biter per 2 tegn
- Byte: en hvilken som helst 8-bitsverdi, 8 biter per byte
- Kanji: Shift JIS-tegn på to byte, 13 biter hver
Modusindikatorer og segmenter
Hver dataserie begynner med en modusindikator på 4 biter og et tegnantall, der lengden avhenger av modusen og versjonen. En kode kan inneholde flere slike segmenter, for eksempel numerisk for en lang rekke sifre og byte for resten, og det kan gjøre resultatet mindre.
Andre indikatorer på 4 biter signaliserer funksjoner i stedet for tegnsett: ECI for å oppgi en tegnkoding, structured append for å dele data over flere koder, og FNC1 for GS1 og andre bransjespesifikke dataformater. En terminator på fire nullbiter avslutter dataene.
- Numerisk 0001, alfanumerisk 0010, byte 0100, kanji 1000
- ECI 0111, structured append 0011
- FNC1 første posisjon 0101, andre posisjon 1001
- Terminator 0000
Bytemodus og tegnsett
Standardens forvalgte tolkning av bytemodus er ISO-8859-1 (Latin-1), men de fleste generatorer skriver i dag UTF-8 slik at aksenttegn, andre skriftsystemer og emoji overlever. Lesere gjenkjenner vanligvis UTF-8 ved å undersøke bytene.
Der tegnsettet må være entydig, kan en ECI-header oppgi det eksplisitt. Uten en slik header kan en leser av og til gjette feil og vise forvrengte tegn.