Der QR-Code Code ist ein 2-dimensionaler Code, der aus Codewörtern für Daten und Fehlerkorrektur besteht, sowie feste Strukturen (feste Muster, Fixed Pattern) aufweist die zur Codelagebestimmung und Gitterrekonstruktion bestehen.

Für SmartPhones gibt es viele Apps, die den QR-Code Code dekodieren können. Bezüglich der vollständigen Umsetzung des Codes hapert es aber oft. Es fängt mit der ganz einfachen (nach Norm erlaubt und spezifiziert) Negativversion des Codes an (Heller Code auf dunklem Hintergrund) die nicht gelesen werden. Der Code darf  auch gespiegelt gedruckt werden. Das erkennen die Apps oft auch nicht. Zu prüfen ist auch ob die verschiedenen Kodiermethoden korrekt umgesetzt sind (inbesondere ECI ist kritisch).

In der Zwischenzeit können die Kameraapps der verschiedenen Smartphones den QR-Code direkt ohne Zusatzapp lesen. Leider wird der Data Matrix Code, der bei industriellen Anwendungen dominiert, meistens von der Kameraapp nicht gelesen. Es ist nach wie vor eine separate Codeleseapp erforderlich (Stand Jahr 2023). Selbst ambitionierte Hersteller wie Apple sind nicht in der Lage der Kameraapp das Lesen der Data Matrix Codes beizubringen geschweige denn die ISO normierten Datenstrukturen zu interpretieren. 

Das Erkennungsmerkmal der Matrix Codes ist, dass diese in einer Schachbrettform aufgebaut werden. Jedes einzelne Feld beinhaltet eine Information (1 bit nur im Datenbereich). Da beim QR-Code jedes Feld (bzw. Matrixzelle oder  Modul) entweder hell oder dunkel sein kann, kann in einer Zelle ein Bit kodiert werden. Ein Bit kann den Wert 0 oder 1 aufweisen. Es werden immer 8 dieser Matrixzellen zusammengefasst. Diese Zusammenfassung ist ein Codewort. Da eine Matrixzelle ein Bit umfasst sind 8 Zellen 8 bit. Mit 8 bit lassen sich die Zahlenwerte von 0 bis 255 kodieren.

Ein Codewort in einem QR-Code ist als stehendes oder liegendes Rechteck mit einer Matrix von 2 x 8 bzw. umgekehrt ausgeführt.

Die typische Platzierungsregel der Codewörter geht von der unteren rechten Codeecke aus. Das ist die Ecke ohne das Suchmusterquadrat. Die Codewörter werden in Spaltenbreiten mit je zwei Matrixzellen von unten rechts nach oben mäanderförmig verteilt. Wenn Codewörter asymetrisch an die festen Muster angrenzen dann wird die Codewortgeometrie angepasst.

Bits, die übrigbleiben weil kein vollständiges Codewort mehr hinein passt werden mit 0 Werten aufgefüllt. Codewörter, die für Dateninhalt des Code nicht benutzt werden, werden zu Füllzeichen. Diese Bits und diese Füllzeichen wird ein Scanner nie übertragen. Nach der Platzierung der Codewörter werden erfolgt eine XOR Bitmaskierung (8 Varianten, nur auf die Datenbereiche angewendet). Dieser Schritt wird vorgenommen um eine möglichst homogene Verteilung der schwarzen und weißen Module zu erreichen. 

Des QR-Code gibt es in der Model 1, Model 2 und 2005 Version. Model 1 ist veraltet und nur noch rudimentär in der Norm ISO/IEC 18004 beschrieben (Die vollständige Model 1 Spezifikation AIM ISS 97 ist als historische Dokumentg über den Industrieverband AIM verfügbar). Die aktuelle Version ist 2005. Die Version 2005 hat gegenüber der Model 2 Version einige Ergänzungen. Dabei handelt es sich um Symbolverkettungen (structured Append), ECI Dateninterpretation, negative (reflectance reversal) und gespiegelte Symbole. Der Micro QR-Code ist eine verkleinerte Version bei dem auf Suchmuster verzichtet wird (nur ein Quadrat anstelle von drei. Es sind die die Größen M1, M2, M3 und M4 des Micro-QR-Code spezifiziert. Den 2005 QR-Code gibt es in der Version 1 bis 40 (die sich durch die Matrixgrößen unterscheiden - 21 x 21 bis 177 x 177 in Schritten von 4).

Die Fehlerkorrektur des QR-Codes (Model 2 und 2005) benutzt den Reed Solomon Algorithmus. Mit den Stufen L, M, Q und H wird festgelegt wie viele Codewörter zur Fehlerkorrektur benutzt werden. In der L Version sind es 7%, M 15%, Q 25% und H 30%. Der Mirco QR-Code unterstützt die Stufe H nicht. Aufgrund der variablen Fehlerkorrektureinstellung ist in der Norm ISO/IEC 18004 eine Tabelle (Tabelle 9) vorhanden, die für jede Version die Anzahl der Codewörter auflistet. Pro Version und pro Fehlerkorrekturstufe gibt die Tabellen dann die Anzahl der Codewörter für die Fehlerkorrektur an.


Das folgende Bild zeigt einen QR-Code in der Fehlerkorrekturstufe H.

QR-Code Fehlerkorrekturstufe H

Die beiden folgenden Bilder zeigen den QR-Code in der Fehlerkorrekturstufe M. Die Matrix wird dadurch bei gleichem Codeinhalt kleiner. Die geht auf Kosten der Fehlertoleranz. Abgesehen von der positiven und negativen Darstellung sind beide Codes identisch.    
 


QR-Code Fehlerkorrektur M, Positiv und negativ    

Die festen Muster unterteilen sich in verschiedene Bereiche. Es gibt das Suchmuster (Finder), das Taktmuster (Timing), die Justagemuster (Alignment).  Die Ruhezonen des QR-Codes sind asymetrisch. Im Bereich der Suchmuster wird eine Ruhezone von 4 Modulen benötigt.  In der Praxis sieht man häufig Symbole mit nur einer Modulbreite als Ruhezone.

Das folgende Bild zeigt rot hervorgehoben die Suchmuster. Die Suchmuster werden zur Lagebestimmung und zur grundsätzlichen Symbollokalisierung benutzt.    
 

QR-Code Finder Pattern

Im nächsten Bild sind die Taktmuster (Timing pattern) rot hervorgehoben. Die grauen Felder zeigen die weißen Module des Taktmusters an. Zwischen dem Taktmuster ist in diesem Fall je ein Justiermuster angeordnet. Wenn das Symbol kleiner wird entfallen diese Muster. Wenn das Symbol größer liegen mehr Justiermuster im Taktmuster. Die Taktmuster zeigt die Matrixzellengröße an. Da es ein Muster in X- und Y-Richtung ist und sichergestellt ist dass immer eine Abfolge von genau einer Matrixzelle in dunkel und heller Sequenz vorhanden ist wird damit die Gitterrekonstruktion erleichtert.

Qr-Code timing pattern

Im nächsten Bild sind die Justagemuster (Aligmnent Pattern) rot hervorgehoben. Die Anzahl der Justagemuster variiert je nach Codegröße. Die Justagemuster erlauben eine Erkennung einer Symbolverzerrung.

QAR-Code Alignment pattern    
 

Bei allen Mustern ist zu beachten, dass normale Scanner den Code nie im 90° Winkel einlesen. Sobald eine Bildaufnahme in einem anderen Winkel erfolgt erscheint der Code im Bild verzerrt. Die Dekodersoftware muss diese Verzerrung mit Hilfe der Suchmuster, Taktmuster und Justagemuster erkennen und kompensieren.

Als Besonderheit weist der QR-Code noch eine Format- und Versionsinformation auf.  Das linke Bild zeigt die Formatinformation hervorgehoben und das rechte Bild die Versionsinformation.    
 

QR-Code - Format und Version

Die Formatinformation besteht aus 15 bits. Davon sind 5 Datenbits und 10 bits dienen zur Fehlerkorrektur (5,15 BCH System) (Wenn die Formatinformation zerstört ist kann der Code nicht gelesen werden und deshalb sind die Fehlerkorrekturbits wichtig). Dier ersten beiden Datenbits zeigen an welcher Fehlerkorrekturstufe benutzt wurde. Die verbleibenden 3 bits zeigen das benutzte Muster zur Datenmaskierung an. Die Datenmaskierung legt über das Symbol eine bestimmte Maske über die eine logische XOR Operation ausgeführt. Damit soll eine möglichst gleichmäßige Verteilung der hellen und dunklen Module erreicht werden.    

Die Versionsinformation gibt nur ab der Version 7 des QR-Codes. Es besteht aus 6 Datenbits und 12 Fehlerkorrekturbits. Aus Redundanzgründen ist die Versionsinformation doppelt im Code vorhanden. Die Versionsinformation zeigt die Matrixgröße an. Version 1 ist 21x21 Matrixzellen groß. Version 2 addiert in jede Achse 4 Matrixzellen. Damit ist die Matrix für Version 2 25x25 Zellen groß. Die maximale Größe ist Version 40 mit 177 x 177 Modulen.     
Die Matrixgröße berechnet sich wie folgt : (Versionsnummer - 1) * 4 + 21. Für die Version 7 ist die Matrix dann 6 x 24 + 21 = 45  (also 45 x 45)

Der QR-Code kennt wie der DataMatrix Code verschiedenene Kodierschemata.    

Im ECI Mode wird die voreingestellte Interpretation 000003 benutzt die den ISO/IEC 8859-1 Zeichensatz repräsentiert. Der ECI Modus 00003 wird daher eher nicht benutzt sondern die anderen für z.B. Kanji oder kyrillische Schriftzeichen.

Im numerischen Modus können die Ziffern 0 bis 9 kodiert werden. 3 Ziffern können in 10 bit kodiert werden bzw. 1 Ziffer benötigt 3,33 bits.

Der alphanumerische Modus ist bezüglich der Zeichensatzauswahl beschränkt. Es stehen lediglich 45 Zeichen zur Auswahl.  Es handelt sich dabei um die Ziffern 0 bis 9 udn die 26 Großbuchstaben von A bis Z. Dazu kommt das Leerzeichen, , $, %, *, +, -, .,/, :) Meistens werden für zwei Zeichen 11 bits benötigt.  Die häufig anzutreffende URL Kodierung verwendet meistens Kleinbuchstaben und daher werden URL's im Byte Modus kodiert.

Im Byte modus werden 8 Bits pro Zeichen benutzt. Der Byte Modus kann beliebige Daten kodieren. Es bedarf daher einer Vereinbarung über die Bedeutung der Daten. Wenn es keine Vereinbarung zur Bedeutung der Daten im Bytgemodus gibt sollen die Zeichen gemäß der Norm  ISO/IEC 8859-1 interpretiert werden.

Im Kanji Modus werden die japanischen Zeichen kodiert. Dies ist eine Besonderheit des QR-Codes. Andere Codearten können das nur im Byte oder ECI Modus. Es wird nach JIS X 0208 gearbeitet. Die 16bit Zeichen werden in den Code mit einem Platzbedarf von 13bit komprimiert kodiert (der QR-Code wurde von der japanischen Firma Denso entwickelt).

Im Structured Append Modus werden mehrere Symbole miteinander verkettet. Damit kann eine große Datenmenge kodiert werden. Der Nachteil ist, dass jedes Symbol einzeln gelesen werden muss und die Daten nacher wieder zusammengefügt werden müssen. In jedem Symbol ist die Symbolnummer und die Anzahl der Symbole  in der Kette kodiert.

Im FNC1 Modus werden die Daten nach festgelegten Strukturvorgaben kodiert. Das Bitmuster, das den FNC1 Modus anzeigt, erscheint  als Erstes im Code. In diesem Fall  werden die Daten in der Syntax der Application Identifier gemäß den GS1 General Specifications kodiert. Diese Struktur wird von der GS1 Organisation alleine kontrolliert. Wenn sich das Bitmuster für den FNC1 Modus sich an der zweiten Stelle befindet, dann soll eine Datenstruktur kodiert werden die durch den AIM Verband festgelegt wird. Ein solche Festlegung existiert aber nicht und daher wird dieser Modus in der Praxis nicht benutzt.  Wenn das Bitmuster für den FNC1 Modus  an der ersten Stelle kodiert wurde, dann nennt die GS1 Organisation das Ergebnis GS1 QR-Code. Die Bezeichnung GS1 QR-Code kann den Eindruck hervorrufen, dass der GS1 QR-Code eine andere Codeart ist als der QR-Code. Das ist nicht der Fall. Es drückt lediglich in einer kurzen Form die Anwendung des QR-Code zusammen mit den Datenstrukturen der GS1 Organisation aus. Im Gegensatz zu einen Data Matrix Code oder Code 128 gibt es im QR-Code kein FNC1 Zeichen. Der FNC1 Modus wird wie oben beschrieben mit einen Bitmuster am Codeanfang angezeigt. 

Der Symbolgieidentifikator nach ISO/IEC 15424, der den Datenträger identifiziert beinhaltet einen Modifier für den FNC1 Modus. Der Symbologieidentifier wird nur vom Dekoderalgorithmus des Scanners generiert und den dekodierten Daten vorangestellt. Wenn das Bitmuster für den FNC1 Modus vorhanden ist wird ein anderer Symbologieidentifikator generiert als wenn das FNC1 Bitmuster nicht vorhanden ist. 

Die präzisere und sicherere  Identifizierung der Datenstruktur ist dem Verfahren gemäß der Norm  ISO/IEC 15434 festgelegt.  Das Format 05 zeigt die Nutzung der Datenstruktur mit den GS1 Application Identifiern an. In der Praxis wird das Format 05 nicht benutzt und GS1 beschreibt in den GS1 General Specifications dieses Verfahren auch nicht.    

Eingeführt wurde die Systematik, zur Erkennung der GS1 Datenstruktur, mit dem FNC1 Zeichen bei dem Code 128. Bei dem Code 128 ist dies eine technisch sehr sinnvolle Lösung, da das FNC1 Zeichen dort existiert in allen drei Zeichensätzen des Code 128 die gleiche Bedeutung hat. Dadurch bleibt der Code mit den GS1 Strukturierten Daten möglichst kurz. Die formal bessere Alternative mit dem Format 05 nach ISO/IEC 15434 würde anstelle von einem Zeichen (FNC1) die Kodierung von 8 Zeichen erzwingen. Für einen Strichcode wie den Code 128 sind das zu viele Verwaltungsdaten.

Im Gegensatz zum DataMatrix Code kennt der QR-Code keine Makrocodewörter für die Formate 05 und 06 nach ISO/IEC 15434. Daher müssen die ISO/IEC 15434 Formate mit jeweils 6 Zeichen als Präfix und 2 Zeichen als Suffix kodiert werden ( Das Makrocodewort würde die 8 Zeichen durch ein Zeichen ersetzen).

Eine weitere Besonderheit sind die Trennzeichen, die Datenfelder trennen wenn die Application Identifier Struktur oder die Data Identifier Struktur benutzt wird. Es gibt kein FNC1 Zeichen in dem QR-Code das dazu benutzt werden könnte (im Gegensatz zu Data Matrix und Code 128) . Die Norm legt daher fest, dass das ASCII Steuerzeichen GS (1Dhex) benutzt werden muss oder das Prozent Zeichen (%). Das Prozentzeichen hat den Vorteil, dass es auch verarbeitet wird, wenn der Scanner in dem Modus einer Tastaturemulation betrieben wird. Wenn tatsächlich das Prozentzeichen gemeint ist (anstelle der Feldtrennfunktion) muss das Prozentzeichen im FNC1 Modus doppelt kodiert werden.

Steckbrief:    
Kleinste Matrix 11 x 11, Größe Matrix 17 x 17 (Micro QR-Code)    
Kleinste Matrix 21 x 21    
Größte Matrix 177 x 177, 1817 Kanjizeichen, 2953 Bytes, 4296 a/n Zeichen, 7089 Ziffern    
Keine Rechteckmatrix

Es ist eine asymmetrische Ruhezone von 4 Modulen im Bereich des Suchmusters erforderlich    
Die ECC200 Fehlerkorrektur nach Reed Solomon gibt es in den vier Stufen L (7%), M (15%), Q(25%), H(30%) (Anzahl der wiederherstellbaren Codewörter in bezogen auf die Gesamtanzahl der Codewörter)

Inverse und spiegelbildliche Symbole sind erlaubt, Leserichtung Omnidirektional.

Mehrere Symbole können verkettet werden    
Die alte Modell 1 Version soll nicht mehr benutzt werden.    
Aus der  Model 2 version wurde die 2005 Version. Diese ergänzte u.a. die inversen und spiegelbildlichen Symbole.