Wer schon einmal QR-Codes erzeugt hat, kennt dieses Rätsel: Der Inhalt ist nicht lang, doch der Code kommt so dicht heraus, dass er kaum zu erkennen ist — während der Code eines anderen, der auf eine recht lange URL verweist, viel lichter aussieht.
Der Grund ist, dass ein QR-Code intern vier verschiedene Kodierungsmodi hat. Verschiedene Zeichenarten nutzen verschiedene Kanäle, und der beanspruchte Platz kann sich um ein Mehrfaches unterscheiden. Versteht man das, kann man die Dichte eines Codes gezielt steuern.
Vier Kodierungsmodi: dieselbe Information, sehr verschiedene Größen
QR-Codes bieten eigene Kodierungen für verschiedene Zeichentypen, jede mit einer anderen „Packeffizienz":
| Modus | Zeichen | Bits pro Zeichen | Relative Effizienz |
|---|---|---|---|
| Numerisch | 0-9 | etwa 3,33 Bit | Höchste (40 % gespart) |
| Alphanumerisch | 0-9 A-Z Leerzeichen $%*+-./: | etwa 5,5 Bit | Hoch |
| Byte | Alles Übrige (inkl. Chinesisch) | 8 Bit | Grundlinie |
| Kanji | Shift-JIS-Kanji | 13 Bit | Etwas besser für gängige CJK-Zeichen |
Der springende Punkt: Ein chinesisches Zeichen belegt in UTF-8 3 Bytes, also 24 Bit, während ein lateinischer Buchstabe 1 Byte (8 Bit) belegt. Für dieselben „20 Zeichen" braucht Chinesisch also 480 Bit und Englisch nur 160 — ein Unterschied von 3×.
Das ist der direkteste Grund, warum chinesische QR-Codes dichter ausfallen.
Der Kanji-Modus hilft ein wenig, unter Bedingungen
Der QR-Standard enthält einen eigenen „Kanji-Modus", in dem jedes Zeichen nur 13 Bit belegt — fast die Hälfte der 24 Bit des Byte-Modus. Klingt großartig, hat aber eine harte Einschränkung: Er unterstützt nur Zeichen, die in der Shift-JIS-Kodierung existieren.
Shift-JIS ist eine japanische Kodierung, und die Menge der abgedeckten Zeichen überschneidet sich nicht vollständig mit GB2312 oder Unicode. Also:
- Viele gängige chinesische Zeichen treffen darauf und sparen Platz;
- Manche vereinfachten Zeichen, seltene Zeichen und alle nicht-chinesischen Zeichen (chinesische Satzzeichen, Emoji) fallen auf den Byte-Modus zurück;
- Der Generator muss intelligent zwischen den beiden Modi wechseln, sonst wird sehr wenig gespart.
In der Praxis nutzen viele Generatoren durchgehend den Byte-Modus, um Kompatibilität und Korrektheit zu garantieren. Das Ergebnis ist, dass chinesischer Inhalt komplett mit 24 Bit pro Zeichen gerechnet wird und der Code dicht ausfällt.
Ein praktischer Hinweis nebenbei: Chinesische Satzzeichen belegen ebenfalls 3 Bytes. Der vollbreite Punkt 。, das Komma ,und das Aufzählungskomma 、sind alle vollbreit und belegen je 3 Bytes. Ist Ihr Inhalt satzzeichenlastig, versuchen Sie auf halbbreite Satzzeichen zu wechseln, um etwas Platz zurückzugewinnen.
Fehlerkorrekturstufe: Redundanz kauft Toleranz
Die andere Stelle, an der ein QR-Code Platz verbraucht, ist der Fehlerkorrekturcode. Er nutzt Reed-Solomon-Kodierung, um den Daten Redundanz hinzuzufügen, damit auch bei verschmutztem Teil des Musters der ursprüngliche Inhalt noch rekonstruiert werden kann. Vier Stufen:
- Stufe L: etwa 7 % Redundanz, gleicht ungefähr 7 % Schaden aus
- Stufe M: etwa 15 % (die häufigste Voreinstellung)
- Stufe Q: etwa 25 %
- Stufe H: etwa 30 %, die höchste Toleranz
Diese Redundanz belegt echten Platz. Bei Version 10 (57×57 Module) fasst Stufe L 271 Bytes, während Stufe H nur 119 fasst — fast 56 % weniger.
Muss Ihr Code also nur von einem Bildschirm gescannt werden, reichen L oder M völlig, und das Muster wird merklich lichter und leichter zu scannen. Greifen Sie nur dann zu Q oder H, wenn der Code auf etwas gedruckt wird, das verschleißen kann, oder wenn ein Logo in die Mitte soll.
Genau so funktioniert ein Logo in der Mitte: Die bedeckte Fläche wird als Schaden behandelt und aus den 30 % Redundanz von Stufe H rekonstruiert. Setzen Sie ein Logo auf einen Code der Stufe L, wird er im Wesentlichen nicht scannen.
Version: die „Größenklasse" eines QR-Codes
Es gibt insgesamt 40 Versionen, und Version n hat eine Kantenlänge von 4n + 17 Modulen:
- Version 1: 21 × 21
- Version 2: 25 × 25
- Version 10: 57 × 57
- Version 20: 97 × 97
- Version 40: 177 × 177
Die Kapazität steigt von einigen Dutzend Bytes bei Version 1 bis auf 2.953 Bytes bei Version 40 (Stufe L, Byte-Modus). Der Generator wählt die kleinste Version, die Ihren Inhalt fasst.
Zwei Dinge sind hier beachtenswert:
- Die Modulzahl wächst mit dem Quadrat der Kantenlänge. Von Version 20 auf 40 verdoppelt sich die Kante nicht einmal, doch die Modulzahl verdreifacht sich auf das 3,3-Fache. Ein Code hoher Version endet also mit sehr kleinen einzelnen Modulen.
- Zu kleine Module scannen nicht. Theoretisch braucht jedes Modul mindestens 2 bis 3 Pixel für stabile Erkennung. Treibt Ihr Inhalt die Version über 20 und ist die Druckgröße bescheiden, ist er in der Praxis womöglich nicht scannbar.
Praktische Schlüsse: Machen Sie Ihren QR-Code leichter scannbar
Um einen Code zu erhalten, der sowohl klar als auch leicht zu scannen ist, optimieren Sie in dieser Reihenfolge:
- Verkürzen Sie den Inhalt. Das ist mit Abstand der wirksamste Hebel. Kürzere URLs, weniger Parameter und eine Kurzlink-Weiterleitung dazwischen sind der übliche Ansatz. Halbieren Sie den Inhalt, und die Version kann mehrere Stufen fallen.
- Senken Sie die Fehlerkorrekturstufe. Nutzen Sie L oder M für die Bildschirmanzeige, statt reflexhaft H zu wählen. Höhere Stufen lohnen sich nur, wenn ein Logo eingebettet werden muss oder der Code auf ein verschleißanfälliges Material gedruckt wird.
- Erhalten Sie die Ruhezone. Ein QR-Code braucht auf allen Seiten einen klaren Rand von mindestens vier Modulen Breite — die Ruhezone —, den der Erkennungsalgorithmus nutzt, um die Kante des Codes zu finden. Sie wegzuschneiden ist die Ursache Nummer eins für Scanfehler, noch häufiger als Unschärfe.
- Erlauben Sie genug Pixel. Mindestens 4 Pixel pro Modul ist das sichere Ziel, also braucht Version 10 (57 Module) mindestens 228 Pixel Breite.
- Verwenden Sie kein kleines Rasterbild. Müssen Sie einen Code in ein Bild einbetten, exportieren Sie mit ausreichender Auflösung oder nutzen Sie ein Vektorformat (SVG), damit Skalierung ihn nicht verwischt.
Wie man erkennt, wie dicht der eigene Code ist
Zwei Wege:
Erstens: Achten Sie auf die Versionsnummer, die das Werkzeug beim Erzeugen meldet — je niedriger die Version, desto leichter scannt sie. Nutzen Sie den QR-Code-Generator, zeigt er die Version und die Bytezahl, die Ihr Inhalt belegt, sodass Sie den Inhalt ändern und die Version beobachten können und ein Gefühl dafür bekommen, „diese paar Zeichen zu entfernen senkt die Version um eine Stufe".
Zweitens: Geben Sie einen bestehenden Code in den QR-Code-Decoder und prüfen Sie Version, Fehlerkorrekturstufe und Inhaltstyp. Finden Sie einen angeblich langen Inhalt in einer niedrigen Version, enthält der Inhalt wahrscheinlich einen Kurzlink.
Beide Werkzeuge laufen lokal in Ihrem Browser; die Bilder, die Sie erzeugen und hochladen, gehen nie über einen Server.
In einem Satz
Die Dichte eines QR-Codes = Inhalt in Bytes ÷ Kodierungseffizienz + Fehlerkorrektur-Redundanz. Chinesisch zählt mit 3 Bytes, chinesische Satzzeichen ebenso, weshalb chinesische Codes von Natur aus dichter sind. Um einen lichter zu machen, sind die wirksamsten Schritte weniger Inhalt und eine niedrigere Korrekturstufe — nicht ein anderer Generator.