Os quatro modos principais
Cada modo troca variedade de caracteres por densidade. O modo numérico só trata dígitos, mas empacota três deles em 10 bits, enquanto o modo byte trata qualquer byte, mas gasta 8 bits em cada um.
O modo alfanumérico cobre um conjunto de 45 caracteres: os dígitos 0–9, as letras maiúsculas A–Z, o espaço e os símbolos $ % * + - . / e dois-pontos. As letras minúsculas não fazem parte do conjunto, e por isso uma URL toda em maiúsculas pode gerar um código menor que a mesma URL em minúsculas.
- Numérico: dígitos 0–9, 10 bits para cada 3 dígitos
- Alfanumérico: 45 caracteres, 11 bits para cada 2 caracteres
- Byte: qualquer valor de 8 bits, 8 bits por byte
- Kanji: caracteres de dois bytes em Shift JIS, 13 bits cada
Indicadores de modo e segmentos
Cada trecho de dados começa com um indicador de modo de 4 bits e uma contagem de caracteres, cujo tamanho depende do modo e da versão. Um código pode conter vários desses segmentos, por exemplo numérico para uma longa sequência de dígitos e byte para o resto, o que pode deixar o resultado menor.
Outros indicadores de 4 bits sinalizam recursos, e não conjuntos de caracteres: ECI, para declarar uma codificação de caracteres; structured append, para dividir os dados entre vários códigos; e FNC1, para os formatos de dados da GS1 e de outros setores. Um terminador de quatro bits zero encerra os dados.
- Numérico 0001, alfanumérico 0010, byte 0100, kanji 1000
- ECI 0111, structured append 0011
- FNC1 na primeira posição 0101, na segunda posição 1001
- Terminador 0000
Modo byte e conjuntos de caracteres
A interpretação padrão do modo byte na norma é ISO-8859-1 (Latin-1), mas a maioria dos geradores hoje grava em UTF-8, para que letras acentuadas, outros alfabetos e emojis sobrevivam. Os leitores costumam detectar o UTF-8 examinando os bytes.
Quando o conjunto de caracteres precisa ser inequívoco, um cabeçalho ECI pode declará-lo explicitamente. Sem ele, um leitor pode, de vez em quando, errar o palpite e mostrar caracteres embaralhados.