De vier hoofdmodi
Elke modus ruilt tekenbereik tegen dichtheid. De numerieke modus verwerkt alleen cijfers, maar stopt er drie in 10 bits, terwijl de bytemodus elke byte verwerkt maar er 8 bits per byte aan besteedt.
De alfanumerieke modus omvat een set van 45 tekens: de cijfers 0–9, de hoofdletters A–Z, de spatie en de symbolen $ % * + - . / en de dubbele punt. Kleine letters zitten niet in de set, en daarom kan een URL in hoofdletters een kleinere code opleveren dan dezelfde URL in kleine letters.
- Numeriek: cijfers 0–9, 10 bits per 3 cijfers
- Alfanumeriek: 45 tekens, 11 bits per 2 tekens
- Byte: elke waarde van 8 bits, 8 bits per byte
- Kanji: dubbelbyte-tekens in Shift JIS, elk 13 bits
Modusindicatoren en segmenten
Elke reeks gegevens begint met een modusindicator van 4 bits en een tekenaantal, waarvan de lengte van de modus en de versie afhangt. Een code kan meerdere van zulke segmenten bevatten, bijvoorbeeld numeriek voor een lange reeks cijfers en byte voor de rest, wat het resultaat kleiner kan maken.
Andere indicatoren van 4 bits geven functies aan in plaats van tekensets: ECI om een tekencodering aan te geven, structured append om gegevens over meerdere codes te verdelen, en FNC1 voor GS1 en andere brancheformaten. Een afsluiter van vier nulbits beëindigt de gegevens.
- Numeriek 0001, alfanumeriek 0010, byte 0100, kanji 1000
- ECI 0111, structured append 0011
- FNC1 eerste positie 0101, tweede positie 1001
- Afsluiter 0000
Bytemodus en tekensets
De standaardinterpretatie van de bytemodus in de norm is ISO-8859-1 (Latin-1), maar de meeste generatoren schrijven tegenwoordig UTF-8, zodat letters met accenten, andere schriften en emoji behouden blijven. Lezers herkennen UTF-8 meestal door de bytes te inspecteren.
Waar de tekenset ondubbelzinnig moet zijn, kan een ECI-kop hem expliciet aangeven. Zonder kop kan een lezer af en toe verkeerd raden en onleesbare tekens tonen.