QR-Codes aus dem Chat, und wozu dann noch ein Werkzeug
Drei Chat-Anwendungen bekamen denselben Satz und lieferten in unter einer Minute einen QR-Code. Nachgemessen unterscheiden sich die drei Ergebnisse. Keines kodiert genau das, was eingegeben wurde. Was daraus für ein eigenes Werkzeug folgt, und was an einem Tag beim Bauen schiefging.
Am Abend des 30.08.2026 ging auf dieser Seite ein QR-Code-Generator online. Zwei Stunden später tippte ich denselben Satz in drei Chat-Anwendungen: „Erstelle einen QR-Code für ki.herwig.de“. ChatGPT, Gemini und Claude lieferten alle drei ein Bild, das ein Telefon lesen kann. ChatGPT nannte dafür 51 Sekunden.
Das ist die Frage, die über jedem kleinen Web-Werkzeug hängt, seit die Chat-Anwendungen sich Programme schreiben können. Wenn eine Anweisung im Chatfenster genügt, wozu dann noch eine Seite aufsuchen, ein Formular ausfüllen und ein Bild herunterladen?
Die Antwort hängt daran, was in den drei Bildern wirklich steckt. Ich habe sie nachgemessen, und dabei kam etwas heraus, das keines der drei Fenster gezeigt hat.
Was die Norm regelt, und was die Hersteller verabreden
Ein QR-Code ist ein Raster aus hellen und dunklen Feldern. Wie es aufgebaut ist, legt eine Norm fest: ISO/IEC 18004 (externe Seite, iso.org), Ausgabe 4 vom August 2024. Sie beschreibt die Größenstufen, die Kodierung der Daten, die Fehlerkorrektur, den hellen Rand ringsum und einen Referenzalgorithmus zum Lesen. Wer sie im Wortlaut braucht, zahlt 227 Schweizer Franken.
Das Verfahren selbst ist frei. Die Erfinderfirma DENSO WAVE hält Patente darauf und sagt auf ihrer Patentseite:
Keine Anmeldung, kein Vertrag, keine Gebühr, auch nicht bei gewerblicher Nutzung: Das steht so in der Fragenliste derselben Firma (externe Seite, qrcode.com). Geschützt ist allein das Wort. Wer „QR Code“ in einer Veröffentlichung schreibt, soll einen Markenhinweis setzen; wer nur das Bild verwendet, braucht ihn nicht. Die Grenze der Freiheit steht ebenfalls auf der Patentseite, und sie ist die interessantere Hälfte:
Jetzt kommt die Stelle, an der die meisten Missverständnisse anfangen. Die Norm sagt, wie Daten in das Raster kommen. Sie sagt nichts darüber, wie ein WLAN-Zugang, eine Visitenkarte oder ein Termin darin auszusehen hat. Für diese Fälle haben sich Absprachen eingebürgert, und die stammen von verschiedenen Stellen: Die Schreibweise für WLAN kommt aus dem Wiki von ZXing (externe Seite, github.com), einer Lesebibliothek aus dem Android-Umfeld. Die Visitenkarte folgt vCard, der Termin dem iCalendar-Format, und für Adresse, Telefon, SMS und Standort gibt es je ein RFC.
Was ein Gerät davon versteht, entscheidet sein Hersteller. Zwei Beispiele aus dem ZXing-Wiki zeigen, wie fein das wird: Ein Netzwerkname aus lauter hexadezimalen Zeichen gehört in Anführungszeichen, weil ein Leser die Zeichenfolge sonst als Zahl deuten darf und sich mit einem anderen Schlüssel verbindet. Und das Feld für ein verstecktes Netz wurde in älteren Fassungen derselben Bibliothek für etwas ganz anderes benutzt, weshalb dort steht:
True if the network SSID is hidden. (externe Seite, github.com)
Bei WPA3 endet die Verlässlichkeit ganz. Android kennt den Typ SAE seit
Fassung 10, Anwendungen, die auf Googles ML Kit aufsetzen, lesen ihn als
unbekannt, und Apple dokumentiert dazu nichts. Ein Code kann also normgerecht
sein und trotzdem auf dem Telefon in der Hosentasche schweigen.
Was ein QR-Code kostet, in Fläche gerechnet
Die Fehlerkorrektur ist der Teil, den man am ehesten falsch einstellt. In jedem Code steckt eine Reserve für den Fall, dass ein Stück des Bildes unlesbar wird, und sie ist in vier Stufen wählbar: etwa 7 Prozent bei L, 15 bei M, 25 bei Q und 30 bei H. Diese Reserve belegt Platz, und Platz gibt es nur in festen Sprüngen. Ein Symbol wächst von Version zu Version um vier Module je Seite, von 21 über 25 auf 29 und so weiter bis 177.
Daraus folgt etwas, das der Anzeige in den meisten Werkzeugen fehlt: Zwischen zwei Sprüngen ist Reserve umsonst. Ein Symbol der Version 2 mit 25 Modulen fasst 32 Byte bei Stufe L, 26 bei M, 20 bei Q und 14 bei H. Wer 20 Byte unterbringt, bekommt Stufe Q ohne einen einzigen Modul mehr. Diese Zahlen sind am 30.08.2026 an der eingebundenen Bibliothek nachgemessen worden, durch binäre Suche nach dem längsten Text, den jede Stufe noch annimmt.
Gezählt wird dabei in Byte, und ein Buchstabe kann mehr als eines belegen. Der
Unterschied fällt genau dort auf, wo man ihn am wenigsten erwartet: Größe sind fünf Buchstaben
und sieben Byte, ein Emoji zählt als eines und belegt vier.
Der zweite Punkt, der in der Praxis wehtut, hat mit dem Code selbst wenig zu tun. Ob ein Aufdruck gelesen wird, entscheidet sich an der Druckgröße, am Kontrast zum Untergrund, an der Kamera und an der Anwendung, die liest. Der helle Rand ringsum gehört dazu, heißt Ruhezone und misst vier Module. Wer ihn beim Zuschneiden wegnimmt, bekommt einen Code, der auf einem Gerät liest und auf dem nächsten schweigt.
Und dann gibt es noch die Entscheidung, die sich nach dem Druck nicht mehr zurücknehmen lässt: den Kurzlink. Ein Code, der über die Weiterleitung eines fremden Dienstes geht, hängt für seine gesamte Lebensdauer an diesem Dienst. Ein Aufkleber an einer Wand überlebt viele Firmen, die Weiterleitungen anbieten.
Drei Anwendungen, dieselbe Anweisung
Am 30.08.2026 zwischen 23:29 und 23:32 Uhr bekamen ChatGPT, Gemini und Claude denselben Satz. Alle drei lieferten. Was sie lieferten, habe ich anschließend mit jsQR dekodiert, einem Decoder, der mit keinem der drei etwas zu tun hat, und danach mit dem eigenen Kodierer nachgebaut: Für jeden gefundenen Inhalt entstehen alle 32 möglichen Fassungen, vier Fehlerkorrekturstufen mal acht Masken, und die Matrizen werden bitweise verglichen. Der Treffer sagt, welche Einstellung die Anwendung gewählt hat.
| ChatGPT | Gemini | Claude | |
|---|---|---|---|
| Kodierter Inhalt | https://ki.herwig.de | https://ki.herwig.de | https://ki.herwig.de |
| Version | 2 | 2 | 3 |
| Module je Seite | 25 | 25 | 29 |
| Fehlerkorrektur | L, etwa 7 Prozent | L, etwa 7 Prozent | H, etwa 30 Prozent |
| Stufe im Fenster genannt | nein | nein | ja |
| Gegenprobe erwähnt | nein | nein | ja |
| Ausgabe | SVG zum Herunterladen | Bild im Fenster | PNG und SVG |
Vier Beobachtungen, und die erste gilt für alle drei.
Aus ki.herwig.de wurde https://ki.herwig.de. Acht Zeichen, die niemand
verlangt hatte. Die Ergänzung ist verteidigbar, denn ohne Schema erkennt nicht
jede Kamera einen Link. Sie kostet aber Größe: 12 Byte passen in Version 1
mit 21 Modulen, 20 Byte brauchen Version 2 mit 25. Bei einem Aufdruck von
fester Kantenlänge wird jedes einzelne Feld dadurch kleiner. Zwei der drei
Anwendungen erwähnen die Ergänzung mit keinem Wort. Claude schreibt sie
hinterher hin und bietet an, sie wegzulassen.
ChatGPT und Gemini haben denselben Code geliefert. Gleiche Version, gleiche Stufe, gleiche Maske, und beim bitweisen Vergleich mit unserem Nachbau stimmen bei Gemini alle 625 Module überein, bei ChatGPT 624 von 625. Die eine Abweichung liegt in der äußersten unteren rechten Ecke: ChatGPT zeichnet seinen Code mit abgerundeten Kanten, und die Rundung nimmt dem Eckmodul den dunklen Kern. Das ist Gestaltung.
Beide verschenken dabei Reserve, die nichts gekostet hätte. Der Inhalt belegt genau 20 Byte, Version 2 fasst bei Stufe Q genau 20. Q wäre also drin gewesen, ohne dass der Code um ein einziges Modul wächst. Die Bibliothek, die im Werkzeug dieser Seite rechnet, tut das von selbst: Sie hebt die Stufe an, solange dieselbe Version reicht. ChatGPT und Gemini bleiben bei L, also bei 7 Prozent Reserve statt 25 auf identischer Fläche.
Claude nennt seine Stufe, und die Angabe stimmt. „Fehlerkorrektur-Level H (30 % Redundanz), das Dekodieren habe ich gegengeprüft“ stand im Fenster, und die Nachmessung bestätigt H. Von den drei Angaben war das die einzige nachprüfbare. Dafür braucht dieser Code Version 3 mit 29 Modulen statt 25, was für einen Aufkleber an einer Wand die bessere Wahl sein kann und für ein kleines Feld auf einer Visitenkarte die schlechtere.
Was diese Messung nicht hergibt, gehört daneben. Drei Anwendungen, je ein Lauf, ein Abend, ein Satz. Ein Lauf ist eine Aussage über einen Lauf. Hinter mindestens zwei der drei Ergebnisse läuft ein Programm, das ein Modell selbst geschrieben hat: Beide Häuser dokumentieren das Werkzeug dafür, OpenAI als Code Interpreter (externe Seite, developers.openai.com) und Anthropic als Code execution tool (externe Seite, platform.claude.com). Damit entscheidet die Wahl einer Programmbibliothek über das Ergebnis, und dieselbe Anweisung kann morgen eine andere Bibliothek treffen. Auch die Ruhezone habe ich gemessen und lasse die Zahlen weg: Sie sagen etwas über die Darstellung im Chatfenster und nichts über die Datei, die man herunterlädt.
Wozu dann noch ein Werkzeug
Zuerst der Teil, der für die Chat-Anwendungen spricht. Für den häufigsten Fall, eine Adresse auf einem Handzettel, ist die Chat-Anwendung der schnellere Weg. Kein Seitenaufruf, keine Bedienung zu lernen, das Ergebnis liegt in dem Fenster, in dem man ohnehin gerade arbeitet. Claude liefert zwei Dateiformate und eine Gegenprobe, die kein mir bekanntes kostenloses Web-Werkzeug anbietet, meines eingeschlossen.
Drei Unterschiede bleiben, und sie sind gemessen.
Reproduzierbarkeit. Derselbe Satz kann morgen einen anderen Code ergeben, weil dazwischen ein Modell eine andere Bibliothek wählt oder dieselbe Bibliothek eine neue Voreinstellung bekommt. Für einen Aufdruck, der in Serie geht und Jahre hält, ist das eine unangenehme Eigenschaft. Ein Werkzeug, das eine feste Bibliothek in einer festgehaltenen Fassung benutzt, liefert bei gleicher Eingabe dasselbe Ergebnis.
Kontrolle über das, was hineingeht. Die Chat-Anwendungen haben eine Entscheidung für mich getroffen und zwei von drei haben sie verschwiegen. Bei einer Adresse ist das harmlos. Bei einem WLAN-Zugang mit Sonderzeichen im Passwort, bei einem Termin über eine Zeitzonengrenze oder bei einer Rufnummer mit Buchstaben wird aus derselben Freundlichkeit ein Code, der sauber dekodiert und etwas anderes enthält als gedacht.
Wo die Eingabe bleibt. Ein WLAN-Passwort, das man in ein Chatfenster tippt, ist beim Anbieter dieses Chatfensters. Das Werkzeug auf dieser Seite rechnet im Browser, und das ist keine Zusage im Kleingedruckten: Die Seite erlaubt sich selbst keine Verbindung zu einem fremden Server, und der Browser setzt das durch.
Bleibt der Punkt, den ich nicht auflösen kann. Wenn Chat-Anwendungen kleine Aufgaben dieser Art übernehmen, verlieren viele einzelne Web-Werkzeuge ihren Grund. Das Werkzeug hier ist kostenlos, es soll ein Grund sein, dass jemand vorbeischaut. Ob das genügt, wenn die Alternative im Chatfenster steht, weiß ich nicht. Darauf gibt der Verlauf der nächsten Monate die Antwort.
Ein Werkzeug an einem Tag
Der zweite Teil dieser Geschichte hat mit QR-Codes wenig zu tun und beantwortet eine andere Frage: Wie lange dauert so etwas heute? Zwischen dem ersten Commit um 13:07 Uhr und dem Livegang um 21:37 Uhr lagen an diesem 30.08.2026 achteinhalb Stunden, verteilt auf neun Commits, mit vier Durchgängen dazwischen, in denen ich die Vorschau bedient und Befunde zurückgemeldet habe. Vier weitere Commits gingen an Folgearbeiten, die daraus entstanden. Am Ende standen neun Inhaltstypen, 175 Prüfungen im einen und 95 im anderen Prüfstand, eine eingebundene Fremdbibliothek und eine Lizenzseite.
Interessanter als das Tempo ist, was dabei schiefging, denn es folgt einem Muster.
Alles grün, und die Seite tat etwas anderes. Nach dem Vormittag standen 102 von 102 Prüfungen, die ganze Kette lief durch. Beim ersten Blick in den Browser zeigte das Werkzeug einen Standort statt der voreingestellten Adresse, weil eine Auswahlgruppe mit neun Knöpfen ausgelesen wurde und die Schleife den letzten behielt. Und nach einem Typwechsel blieben die Felder des alten Typs stehen, weil eine Regel im Stylesheet das Verstecken überstimmte. Beide Fehler sind ohne Browser nicht messbar. Daraus entstand ein zweiter Prüfstand, der die Seite wirklich lädt.
Der teuerste Fehler stand in einer Zeile, die in Node läuft und im Browser
nicht. Die Zeilenlänge einer Visitenkarte wurde mit Buffer.byteLength
gezählt, einem Node-Werkzeug, das es im Browser nicht gibt. Betroffen waren
Visitenkarte und Termin, also zwei der neun Inhaltstypen, in jedem Browser, seit
dem ersten Tag. Der Prüfstand lief in Node und sah nichts. Er fasste außerdem
nur zwei der neun Wege an. Ein Prüfstand, der zwei von neun Wegen geht, misst
zwei von neun Wegen. Er geht seitdem alle neun, und daneben steht ein zweiter,
der die Klasse misst statt des einzelnen Falls: Node-Werkzeuge in Dateien, die
im Browser laufen.
Vier Befunde aus der Bedienung hatten dieselbe Ursache. Die Oberfläche behauptete etwas anderes als die Rechnung. Stufe L war wählbar und wirkungslos. Das Stufenmenü stand auf M und gerechnet wurde mit H. Die Farbe des Logos änderte nichts, weil sie beim ersten Klick in eine feste Adresse eingebrannt wurde. Und das Feld für ein eigenes Logo war dauerhaft gesperrt mit dem Hinweis, der Code brauche ein größeres Raster, wobei es für diese Adresse keine Einstellung gab, die dorthin führte. Der Hinweis verlangte eine Handlung, die es nicht gab.
Aus 0800-CALLME wurde tel:0800. Der Filter für Rufnummern warf jeden
Buchstaben weg, und der Hinweis daneben nannte sie Trennzeichen. Seitdem werden
Buchstaben nach der Tastenbelegung umgesetzt, bevor Trennzeichen fallen, und was
auf keiner Taste liegt, wird gemeldet statt entfernt. Dazu kam eine Abschrift von
217 Landesvorwahlen, deren eigentlicher Nutzen der Ländername ist: Ein Vertipper
von +49 zu +40 ergibt eine gültige Nummer und fällt nur an dem Wort
„Rumänien“ daneben auf.
Die Bibliothekswahl entschied eine Rückwärtsprobe. Ein Kodierer, der sich
selbst prüft, prüft nichts, also wird jeder erzeugte Code mit dem fremden
Decoder wieder gelesen. Genau daran fiel der naheliegende Kandidat durch: Er
kodiert voreingestellt Latin-1, und bei WIFI:T:WPA;S:Café Süd;P:Grüße2026;;
werden daraus 35 statt 39 Byte. Der fertige Code sieht gesund aus und
dekodiert als leerer Text. Der in seiner Typdeklaration zugesagte Ausweg
existiert zur Laufzeit nicht, und der Typprüfer läuft trotzdem ohne Fehler
durch. Gewählt wurde stattdessen
Nayukis Bibliothek (externe Seite, nayuki.io), die unter MIT steht und deren
Sprachfassungen laut Projektseite dasselbe Ergebnis liefern.
Und ein Fund am Rand, der älter ist als das Werkzeug. Beim Nachsehen, ob die Lizenzhinweise der eingebundenen Fremdteile im ausgelieferten Stand ankommen, fand sich für die QR-Bibliothek kein einziger Rechtevermerk im gebauten Bündel. Der Hinweis stand in der Quelldatei, wo ihn niemand ausliefert. Dieselbe Prüfung deckte auf, dass die verwendete Schrift seit dem ersten Tag der Seite ohne ihren Lizenztext ausgeliefert wurde. Keine der bis dahin 28 Prüfungen hatte danach je gefragt: Alle fragen nach dem Inhalt, keine danach, ob fremde Arbeit mit ihrer Bedingung mitgeht.
Die Reihenfolge, in der diese Fehler aufgefallen sind, sagt mehr als die Fehler selbst. Der Test zuerst hat einen davon gefunden, bevor es die Funktion gab: Ein Rückstrich fehlte in der Zeichenliste für WLAN-Namen. Die anderen fand ein Mensch, der das Ding benutzt hat. Warum ich den roten Test trotzdem zuerst schreibe, steht in einem eigenen Beitrag.
Was offen bleibt
Die neun Inhaltstypen sind gegen einen unabhängigen Decoder gemessen, nicht gegen Telefone. Für die Formate von WLAN, Visitenkarte und Termin ist das eine Lücke, denn sie sind Herstellerabsprachen, und die eigentliche Abnahme ist ein Scan mit iOS und Android. Diese Probe steht aus. Bei WPA3 weiß ich schon jetzt, dass sie unterschiedlich ausgehen wird.
Der Generator ist kostenlos und ohne Anmeldung erreichbar. Ob er in einem Jahr noch einen Zweck hat, ist nach diesem Abend eine offene Frage.
Quellen
7 Einträge, davon 2 Schlüsselarbeitenalle erreichbar
Erreichbarkeit automatisch geprüft
SchlüsselarbeitOriginalarbeiterreichbar
QR Code Patent (DENSO WAVE) (externe Seite, qrcode.com)
qrcode.comgeprüft 24.09.2026
Die Patentseite der Erfinderfirma. Sie sagt in zwei Sätzen, unter welcher Bedingung der QR-Code frei benutzbar ist und wo diese Freiheit endet, nämlich bei einer Abweichung von der Norm.
SchlüsselarbeitOriginalarbeiterreichbar
ISO/IEC 18004:2024, QR code bar code symbology specification (externe Seite, iso.org)
iso.orggeprüft 24.09.2026
Die Katalogseite der Norm, die den QR-Code festlegt: Raster, Datenkodierung, Fehlerkorrektur, Referenz-Dekodieralgorithmus. Ausgabe 4 vom August 2024, Status to be revised, ein Nachfolger als ISO/IEC WD 18004 in Arbeit. Die Norm selbst kostet 227 CHF.
Dokumentationerreichbar
QR Code FAQ (DENSO WAVE) (externe Seite, qrcode.com)
qrcode.comgeprüft 24.09.2026
Die Fragenliste der Erfinderfirma zu Nutzung, Gebühren und Markenrecht. Drei Antworten daraus, am 30.08.2026 im Wortlaut gelesen: Für die Verwendung eines QR-Codes ist keine Anmeldung nötig, es braucht auch keinen Lizenzvertrag, und wer allein das Bild verwendet, braucht keinen Markenhinweis.
Dokumentationerreichbar
Code Interpreter (OpenAI API) (externe Seite, developers.openai.com)
developers.openai.comgeprüft 24.09.2026
Die Herstellerdokumentation zu dem Tool, mit dem ein Modell sich ein Programm schreibt und laufen lässt, statt selbst zu rechnen. Sie nennt auch, dass dabei Dateien entstehen dürfen.
Dokumentationerreichbar
Code execution tool (Claude Platform) (externe Seite, platform.claude.com)
platform.claude.comgeprüft 24.09.2026
Das Gegenstück bei Anthropic. Die Seite beschreibt eine abgeschottete Umgebung, in der das Modell Programme laufen lässt und Dateien erzeugt.
Dokumentationerreichbar
QR Code generator library (Project Nayuki) (externe Seite, nayuki.io)
nayuki.iogeprüft 24.09.2026
Die Projektseite der Bibliothek, die im QR-Werkzeug dieser Seite die Matrix ausrechnet. Sie nennt Lizenz, Umfang und die Zusage, dass alle Sprachfassungen dasselbe Ergebnis liefern.
Dokumentationerreichbar
Barcode Contents (ZXing-Wiki) (externe Seite, github.com)
github.comgeprüft 24.09.2026
Die Absprache, nach der ein WLAN-Zugang in einem QR-Code steht. Das Wiki einer Lesebibliothek gibt hier den Maßstab vor, an dem sich die Geräte ausrichten. Eine Norm dahinter gibt es nicht.