4つの主なモード
各モードは、扱える文字の範囲と密度のトレードオフになっています。数字モードは数字しか扱えませんが、3桁を10ビットに詰め込めます。バイトモードはどんなバイトでも扱えますが、1バイトごとに8ビットを使います。
英数字モードは、45文字の集合を扱います。数字0〜9、大文字A〜Z、スペース、記号の $ % * + - . / とコロンです。小文字は含まれないため、すべて大文字のURLのほうが、同じURLを小文字で書くよりも、小さなコードになることがあります。
- 数字:0〜9の数字、3桁で10ビット
- 英数字:45文字、2文字で11ビット
- バイト:任意の8ビット値、1バイトで8ビット
- 漢字:シフトJISの2バイト文字、1文字で13ビット
モード指示子とセグメント
データの各区間は、4ビットのモード指示子と文字数から始まります。文字数のビット長は、モードと型番によって決まります。1つのコードには、こうしたセグメントを複数入れられます。たとえば、長い数字の並びは数字モードで、残りはバイトモードでエンコードすると、コードを小さくできることがあります。
ほかの4ビットの指示子は、文字集合ではなく機能を表します。文字エンコーディングを宣言するECI、データを複数のコードに分割する構造的連結、GS1などの業界のデータ形式向けのFNC1です。データは、4つのゼロのビットでなる終端パターンで終わります。
- 数字 0001、英数字 0010、バイト 0100、漢字 1000
- ECI 0111、構造的連結 0011
- FNC1 第1位置 0101、第2位置 1001
- 終端パターン 0000
バイトモードと文字セット
規格では、バイトモードの既定の解釈はISO-8859-1(Latin-1)ですが、最近のジェネレーターの多くは、アクセント付きの文字、ほかの文字体系、絵文字が失われないよう、UTF-8で書き込みます。リーダーは、たいていバイト列を調べてUTF-8を検出します。
文字セットを曖昧にできない場合は、ECIヘッダーで明示的に宣言できます。ECIがないと、リーダーがまれに誤って推測し、文字化けした文字を表示することがあります。