Sonderzeichen im QR Code: Was Sie über die Zeichencodierung wissen sollten

Leider sieht der Standard, in welchem der QR Code definiert ist, keine Default-Zeichencodierung vor. Es existiert auch keine Art von Dateiheader, welcher die Codierung anzeigt. Daher ist so, dass die Mehrzahl der QR Code Reader im Zweifelsfall von einer UTF-8-Codierung ausgehen. Selbst die QR Reader, bei denen dies in älteren Versionen noch anders war (Z.B. i-nigma) haben dies in neueren Version umgestellt. Wir raten daher immer, die QR Code Inhalte UTF-8 codiert zu speichern.

Sie können Ihren QR Code Reader/Scanner und dessen Umgang mit verschiedenen Zeichnsätzen leicht mit der auch von unserem QR Code Generator genutzten API testen (s. charset-target- und charset-source-Parameter). Damit wurden für einen einfachen Test die folgenden QR Grafiken erstellt:

  • Der Text „Hallöchen, öäüß Teste Test Test 123 Foobar“, UTF-8 codiert im QR Code gespeichert:
    QR Code (UTF-8 codiert) mit dem Inhalt „Hallöchen, öäüß Teste Test Test 123 Foobar“
  • Der Text „Hallöchen, öäüß Teste Test Test 123 Foobar“, ISO-8859-1 codiert im QR Code gespeichert:
    QR Code (ISO-8859-1 codiert) mit dem Inhalt „Hallöchen, öäüß Teste Test Test 123 Foobar“

Um ggf. vorhandene Zeichensatzprobleme (z.B. eine falsche Darstellung von Sonderzeichen wie Umlaute) muss man zwei Dinge beachten bzw. unterscheiden:

  1. Die Codierung der Nutzdaten selbst, also die Codierung bzw. das Charset der eigentlichen Nutzdaten (UTF-8, ISO-8859 o.ä.). Sie bleibt bei der Speicherung im QR Code unverändert. Sie wird schlicht nicht angerührt, Konvertierungen finden nicht statt. Es empfiehlt sich, immer UTF-8-codierte-Daten zu verwenden, wie dies schon erwähnt wurde.
    Einfacher ausgedrückt: Die Codierung der Nutzdaten ist völlig unabhängig vom QR Code und wird durch diesen nicht verändert. Die Daten kommen 100% 1:1 so aus dem QR Code, wie sie auch „reinwandern“. Wenn an dieser Stelle etwas schief geht, liegt dies nicht am QR Code Standard, sondern an ggf. zusätzlichen Konvertierungen, die eine QR Code Software vor der eigentlichen QR Code-Speicherung vornimmt.
  2. Die Speichercodierung im QR Code, also NUMERIC, ALHPANUMERIC, KANJI und 8-BIT. Diese Codierungen verändern nicht den Inhalt selbst, sondern nur wie dieser gespeichert wird. Man kann das im Grunde mit Pack-Programmen wie ZIP/RAR/7-ZIP/GZ etc. – alle Packer verändern die Daten selbst nicht (eine UTF-8-Textedatei bleibt vor und nach dem entpacken eine UTF-8-Textdate), komprimieren aber auf völlig unterschiedliche Weise. So ist dies auch bei den QR Code-Codierungen. KANJI ist z.B. effektiver bei japanischen Schriftzeichen als 8-BIT, aber 8-BIT kann dennoch japanische Schriftzeichen speichern.

Die Nutzdatencodierung und die QR Code-Speichercodierung haben an also sich nichts miteinander zu tun. Die verschiedenen QR Code-Speichercodierungen NUMERIC, ALHPANUMERIC, KANJI und 8-BIT existieren nur, weil je nach Input die Daten aufgrund verschiedener Codewortlängen effektiver gepackt werden. D.h. bei NUMERIC kann man eine längere Zahl bzw. mehr numerische Zeichen im QR Code speichern, als wenn man die gleiche Zahl mit der 8-BIT-Codierung im QR Code speichern will.

In der 8-BIT QR Code-Speichercodierung können jedoch alle Arten von Input im QR Code gespeichert werden. Was etwas verwirrend ist: Auch japanische KANJI-Zeichen – der Unterschied zwischen der KANJI QR Code-Speichercodierung und der 8-BIT QR Code-Speichercodierung ist, dass die Codewortlänge bei der KANJI QR Code-Speichercodierung so ausgelegt ist, dass die Speicherung von KANJI-Zeichen im Mittel effektiver erfolgt, als bei der 8-BIT QR Code-Speichercodierung).

Falls nötig speichert unser QR Code Generator in der 8-BIT QR Code-Speichercodierung. D.h. der vorliegende Datenstrom (wie auch immer dieser aussieht) wird in Bytes zu je 8Bit unterteilt, verarbeitet und gespeichert. Ein UTF-8-Mulitbyte-Zeichen wird daher in mehrere Bytes aufgeteilt (analog zur Speicherung eines UTF-8-Strings in std::string von z.B. C++). Es wird sozusagen nur in 8Bit-Bytes gerechnet, nicht in Buchstaben/Glyphen.

QR Code lesen, mögliche Zeichensatzprobleme beim QR Scan

Mögliche Leseprobleme sollen im Folgenden an einem gedanklichen Beispiel verdeutlicht werden. Ein QR Reader scannt den QR Code. Der QR Code teilt der Reader mit, dass die Daten in der 8-BIT QR Code-Speichercodierungen gespeichert sind. Der Reader weiß nun, wie er an die ursprünglichen Datenstrom kommt. Er liest die 8Bit-Brocken und fügt Sie zusammen (zur Erinnerung: Diese Speichercodierung hat den Inhalt aber nicht verändert). Soweit so gut. Jetzt fragen Sie sich vllt. woher der Reader anschließend weiß, wie er mit dem jetzt vorliegenden Datenstrom umzugehen hat. Und das ist in der Tat ein Problem: er weiß es schlicht nicht.

Der QR Code-Standard sieht leider keinen "Header" oder Ähnliches vor, der einem Reader mitteilt, in welchen Charset der nach dem Scan vorliegende Datenstrom nun vorliegt. Wenn ein QR Generator z.B. eine Charset Option anbietet macht er dies, um VOR der Speicherung eine Konvertierung vorzunehmen. Wenn z.B. unsere QR-Code-API direkt mit seinem Browser nutzt und angibt, dass dass der ISO-8859-1-Zeichensatz für den übersendeten Text genutzt werden soll, dann passiert folgendes:

  1. Daten des Browsers werden UTF-8 codiert abgesendet (sofern es sich nicht um eine sehr alte Browser-Version handelt).
  2. Unsere QR Code Software konvertiert die UTF-8-Daten nach ISO-8859.
  3. Die nun ISO-8859 codierten Daten werden mit der 8-BIT-Speichercodierungen im QR Code hinterlegt.
  4. Wenn ein QR Scan erfolgt, wird der 8-BIT-QR Code-Datenstrom vom Reader decodiert und er erhält den ISO-8859 codierten Text, (s. Punkt 2).

Zum Vergleich: wenn der ISO-8859-1-Zeichensatz für den übersendeten Text genutzt wird:

  1. Daten des Browsers werden UTF-8 codiert abgesendet (sofern es sich nicht um eine sehr alte Browser-Version handelt).
  2. Die Daten werden unverändert mit der 8-BIT-Speichercodierungen im QR Code hinterlegt.
  3. Wenn ein QR Scan erfolgt, wird der 8-BIT-QR Code-Datenstrom vom Reader decodiert und er erhält den UTF-8 codierten Text, (s. Punkt 1).

Der Reader kann also nur raten, ähnlich wie ein Text-Editor, der eine Datei öffnet. Wie aber bereits gesagt: Fast alle gängigen Reader gehen aber im Zweifelsfall UTF-8 zur Darstellung des Textes. Der auf Android-Handies kostenlos verfügbare „Barcode Scanner“ ist z.B. empfehlenswert. Setzen Sie daher am besten auf eine UTF-8-Codierung, auch wenn einige wenige, veraltete QR Reader damit nicht umgehen können. Denn diese sind schon heute praktisch unbedeutend und werden von Tag zu Tag weniger.