De fire hovedtilstande
Hver tilstand bytter tegnomfang for tæthed. Numerisk tilstand håndterer kun cifre, men pakker tre af dem i 10 bit, mens bytetilstand håndterer enhver byte, men bruger 8 bit på hver.
Alfanumerisk tilstand dækker et sæt på 45 tegn: cifrene 0–9, de store bogstaver A–Z, mellemrum og symbolerne $ % * + - . / samt kolon. Små bogstaver er ikke med i sættet, og derfor kan en URL med kun store bogstaver give en mindre kode end den samme URL med små bogstaver.
- Numerisk: cifrene 0–9, 10 bit pr. 3 cifre
- Alfanumerisk: 45 tegn, 11 bit pr. 2 tegn
- Byte: enhver 8-bit-værdi, 8 bit pr. byte
- Kanji: Shift JIS-tegn på to bytes, 13 bit hver
Tilstandsindikatorer og segmenter
Hvert dataforløb starter med en tilstandsindikator på 4 bit og et tegnantal, hvis længde afhænger af tilstanden og versionen. En kode kan indeholde flere sådanne segmenter, for eksempel numerisk til et langt forløb af cifre og byte til resten, hvilket kan gøre resultatet mindre.
Andre indikatorer på 4 bit signalerer funktioner frem for tegnsæt: ECI til at angive en tegnkodning, structured append til at dele data ud over flere koder og FNC1 til GS1 og andre brancheformater. En afslutter på fire nul-bit afslutter dataene.
- Numerisk 0001, alfanumerisk 0010, byte 0100, kanji 1000
- ECI 0111, structured append 0011
- FNC1 første position 0101, anden position 1001
- Afslutter 0000
Bytetilstand og tegnsæt
Standardens grundtolkning af bytetilstand er ISO-8859-1 (Latin-1), men de fleste generatorer skriver i dag UTF-8, så bogstaver med accent, andre skriftsystemer og emojis overlever. Læsere genkender som regel UTF-8 ved at undersøge bytene.
Hvor tegnsættet skal være entydigt, kan en ECI-header angive det eksplicit. Uden en kan en læser af og til gætte forkert og vise forvanskede tegn.