Cztery główne tryby
Każdy tryb wymienia zakres znaków na gęstość zapisu. Tryb numeryczny obsługuje tylko cyfry, ale upakowuje po trzy z nich w 10 bitach, a tryb bajtowy obsługuje dowolny bajt, ale na każdy wydaje 8 bitów.
Tryb alfanumeryczny obejmuje zestaw 45 znaków: cyfry 0–9, wielkie litery A–Z, spację oraz symbole $ % * + - . / i dwukropek. Małych liter w tym zestawie nie ma, dlatego adres URL zapisany samymi wielkimi literami może dać mniejszy kod niż ten sam adres małymi literami.
- Numeryczny: cyfry 0–9, 10 bitów na 3 cyfry
- Alfanumeryczny: 45 znaków, 11 bitów na 2 znaki
- Bajtowy: dowolna wartość 8-bitowa, 8 bitów na bajt
- Kanji: dwubajtowe znaki Shift JIS, po 13 bitów każdy
Wskaźniki trybu i segmenty
Każdy ciąg danych zaczyna się od 4-bitowego wskaźnika trybu i licznika znaków, którego długość zależy od trybu i wersji. Kod może zawierać kilka takich segmentów, na przykład numeryczny dla długiego ciągu cyfr i bajtowy dla reszty, co może zmniejszyć wynik.
Inne 4-bitowe wskaźniki sygnalizują funkcje, a nie zestawy znaków: ECI do deklarowania kodowania znaków, structured append do dzielenia danych na kilka kodów i FNC1 dla GS1 oraz innych branżowych formatów danych. Terminator z czterech zerowych bitów kończy dane.
- Numeryczny 0001, alfanumeryczny 0010, bajtowy 0100, kanji 1000
- ECI 0111, structured append 0011
- FNC1 na pierwszej pozycji 0101, na drugiej 1001
- Terminator 0000
Tryb bajtowy i zestawy znaków
Domyślną interpretacją trybu bajtowego w normie jest ISO-8859-1 (Latin-1), ale większość dzisiejszych generatorów zapisuje UTF-8, żeby przetrwały litery z akcentami, inne pisma i emoji. Czytniki zwykle rozpoznają UTF-8, analizując bajty.
Tam, gdzie zestaw znaków musi być jednoznaczny, nagłówek ECI może zadeklarować go wprost. Bez niego czytnik może czasem zgadnąć błędnie i pokazać zniekształcone znaki.