4 Punkte von GN⁺ 2024-04-24 | 3 Kommentare | Auf WhatsApp teilen

Visuell mehrdeutige Zeichen in IDs verstehen

  • Visuell mehrdeutige Zeichen sind Zeichen, die sich in bestimmten Schriftarten oder in handschriftlicher Form nur schwer unterscheiden lassen
    • Dazu gehören etwa O/0, I/l/1/7, 5/S, 2/Z, 8/B, 6/G, 9/q/g
  • Solche Zeichen können bei der Dateneingabe Fehler und Verwirrung verursachen
    • Wenn Benutzer beispielsweise O und 0 nur schwer unterscheiden können und dadurch einen falschen Code eingeben, führt das zu einer schlechten User Experience
  • Besonders wichtig ist das in Situationen, in denen IDs mündlich übermittelt oder von Hand notiert werden müssen
    • etwa im Kundensupport, bei Rabattcodes, Tracking-Codes, Fehler-IDs oder Produkt-IDs

Entscheidung über Groß-/Kleinschreibung

  • Man muss entscheiden, ob IDs zwischen Groß- und Kleinbuchstaben unterscheiden sollen
    • Mit Groß-/Kleinschreibung und unter Ausschluss visuell mehrdeutiger Zeichen stehen 53 Zeichen zur Auswahl
    • Ohne Unterscheidung zwischen Groß- und Kleinbuchstaben stehen 22 Zeichen zur Auswahl
  • Bei einer ID-Länge von 5 Zeichen ergibt das folgende Anzahl möglicher IDs:
    • Mit Groß-/Kleinschreibung: 53^5 = 418,195,493
    • Ohne Groß-/Kleinschreibung: 22^5 = 5,153,632
  • Mit zunehmender ID-Länge wächst die Zahl möglicher IDs jedoch exponentiell
  • Daher muss man einen sinnvollen Kompromiss zwischen ID-Länge und dem Risiko visuell mehrdeutiger Zeichen finden
  • Werden sowohl Groß- als auch Kleinbuchstaben verwendet, können zudem unerwartete Probleme mit Drittsystemen entstehen, die nicht zwischen Groß- und Kleinbuchstaben unterscheiden

Ein visuell eindeutiger Zeichensatz

  • Wenn Lesbarkeit Priorität hat, wird die Verwendung des folgenden Zeichensatzes empfohlen:
    • [ "a", "b", "c", "d", "e", "f", "h", "i", "j", "k", "m", "n", "o", "p", "r", "s", "t", "w", "x", "y", "3", "4"]

Weitere Überlegungen

  • Bestimmte Zeichenkombinationen können wie andere Zeichen aussehen (z. B. kann rn wie m wirken, 3 wie w)
    • Solche Kombinationen sollten daher möglichst schon bei der ID-Erzeugung vermieden werden
  • Auch ähnlich klingende Zeichen sollte man vermeiden (z. B. b und p)
    • Das ist besonders wichtig, wenn IDs mündlich weitergegeben werden

Bestehende Beispiele

  • Crockford's Base32: Dekodiert mehrdeutige Zeichen auf denselben Wert und berücksichtigt auch unbeabsichtigte Schimpfwörter
  • Open Location Code: Verwendet den Zeichensatz 23456789CFGHJMPQRVWX. Ziel ist neben der Vermeidung visueller Mehrdeutigkeiten auch, die Bildung gewöhnlicher Wörter in natürlichen Sprachen zu verhindern. Allerdings sind 6/G und 9/Q enthalten.

Meinung von GN⁺

  • Bei der Erzeugung von IDs sollten Nutzbarkeit und Lesbarkeit oberste Priorität haben. Das gilt besonders dann, wenn IDs häufig mündlich übermittelt oder handschriftlich festgehalten werden müssen.
  • Es ist wichtig, einen Zeichensatz zu wählen, der visuelle Mehrdeutigkeiten minimiert, und zugleich einen angemessenen Kompromiss zwischen ID-Länge und der Anzahl möglicher Kombinationen zu finden.
  • Da bei der Anbindung an Drittsysteme unerwartete Probleme auftreten können, sollte die Frage der Groß-/Kleinschreibung sorgfältig entschieden werden.
  • Zusätzlich sollte die ID-Logik bestimmte Zeichenkombinationen ausschließen oder ähnlich klingende Zeichen vermeiden.
  • Es ist sinnvoll, sich an Beispielen wie Crockford's Base32 oder Open Location Code zu orientieren und auf dieser Basis den optimalen Zeichensatz für die Anforderungen des jeweiligen Projekts zu entwerfen.

3 Kommentare

 
roxie 2025-01-29
 
roxie 2025-01-29

Dass dabei sogar die Aussprache berücksichtigt wurde, ist wirklich erstaunlich.

 
GN⁺ 2024-04-24
Hacker-News-Kommentar
  • Es gab einen realen Fall, in dem bei Millionen von Geräten Seriennummern mit mehrdeutigen Zeichen verwendet wurden, was im Kundensupport zu erheblichen Schwierigkeiten führte. Es war ein albtraumhaftes Erlebnis, per regulären Ausdrücken Tippfehler-Varianten zu erzeugen und sie mit der Datenbank abzugleichen, um die tatsächliche Seriennummer zu erraten.
  • Je nach Nutzer sollte man unterschiedliche Kodierungsmethoden verwenden. Base32 eignet sich gut, weil es einen klaren Zeichensatz hat, und bei mündlicher Übermittlung ist eine Darstellung mit Wortlisten (z. B. "TIDE ITCH SLOW REIN RULE MOT") sinnvoll. Allerdings lauern dabei Fallstricke wie Redewendungen, Homophone und Dialekte, daher sollte man keine eigene Wortliste erstellen.
  • Wegen eines als Scherz auf CPAN hochgeladenen Moduls für Rechenoperationen in beliebigen Zahlensystemen (Math::Fleximal) erhielt jemand unerwartet Supportanfragen. Der Grund war, dass jemand Demo-Code zur Umwandlung von Hexadezimalwerten in alphanumerische Codes in Produktion eingesetzt hatte.
  • Auf dem Eingabebildschirm für DLC-Seriennummern der Nintendo Switch verbessert die Deaktivierung von Tasten für mehrdeutige Zeichen die UX.
  • Man sollte auch Zeichen vermeiden, die sich in Schreibschrift schwer unterscheiden lassen. Besonders '7' und '1' sind leicht zu verwechseln.
  • Wenn man Groß- und Kleinbuchstaben gleichzeitig verwendet, kann es später zu bösen Überraschungen durch Systeme oder Protokolle ohne Case-Sensitivity kommen. Es gibt auch kommerzielle Systeme, die das aus Gründen der Nutzerfreundlichkeit nicht als Bug betrachten.
  • Jedes Mal, wenn 2FA-Backup-Codes auf Papier notiert werden, kommt bei bestimmten Zeichen (o/0, v/u, 5/S usw.) ein ungutes Gefühl auf. Um das zu vermeiden, versieht man Zeichen manchmal mit zusätzlichen Markierungen.
  • Als WLAN-Passwort wurde ein alltägliches Wort gewählt, das selbst ein Kind in der dritten Klasse korrekt buchstabieren kann ("vacation").
  • KeepassXC verbessert die Lesbarkeit deutlich, indem verschiedene Zeichentypen (Großbuchstaben, Kleinbuchstaben, Zahlen, Symbole usw.) farblich unterschieden werden.
  • Bitcoin-Adressen verwenden eine modifizierte Base58-Kodierung.
  • Im Artikel wurde die Schriftart Arial fälschlich als Ariel bezeichnet.