Stranger Than Usual

Nintendo finally released a game where you primarily play as Zelda. By all rights they should have called it “Legend of Link.”

Rebecca Watson

Keilschriftuhr

Eigentlich wollte ich ja gestern nichts über die Bahn schreiben, sondern über etwas Schönes. Ich habe mich ja vor Kurzem über das GRSSK-Phänomen und den Missbrauch von nicht-lateinischen Schriften ausgelassen.

Im Gegensatz dazu kann man Keilschrift aber auch korrekt einsetzen. Da hat zum Beispiel jemand eine Website gebaut, die die Uhrzeit in Keilschrift anzeigt. Bonuspunkte für den Pfadnamen sumertime.

Diese Uhr benutzt die echten Babylonischen Zahlendarstellungen. Die gehen von 1 bis 59 (und ein Leerzeichen für die 0) und sind damit perfekt geeignet, um Minuten und Sekunden darzustellen. Tatsächlich lässt sich die 60 Minuten/Stunde, 60 Sekunden/Minute schlussendlich auf das Sexagesimalsystem der Sumerer und Babylonier zurückführen, auch wenn die eigentlich Aufteilung laut Wikipedia zum ersten Mal vor etwa tausend Jahren verwendet wurde.

Auch die Doppelpunkte, um Stunden, Minuten und Sekunden zu trennen sind wahrscheinlich ein Anachronismus. Trotzdem eine schöne Uhr.

Bahncard-Tortur

Ich sollte mal eine Statistik aufstellen, welche Tags in diesem Blog am häufigsten zusammen vorkommen. Ich würde wetten, es sind „rant“ und „deutsche bahn“.

Was ist es diesmal? Mal wieder der Onlineauftritt, in Kombination mit ihrem halbgaren Digitalzwang. Ich wollte nur eine Bahncard kaufen, weil ich demnächst häufiger mal nach Hamburg fahren muss. Mein Ärger fing schon beim Login an.

Passwortrichtlinien

Die DB hat ihre Passwortrichtlinien geändert. An sich kein Problem. Bisher wurden definitiv zu kurze Passworte erlaubt. Aber anstatt nach dem Stand der Wissenschaft zu gehen, sehe ich das hier:

For your own security, please choose a password that you have never used before. At least 12 characters, contains uppercase letters, contains lowercase letters, contains numbers, contains special characters, not your e-mail address

7 Regeln, nur drei davon sind gut: Das Passwort muss neu sein, mindestens 12 Zeichen lang, nicht die E-Mail-Adresse.

Ich habe mich dazu schon öfters ausgelassen, deswegen spare ich mir das jetzt. Siehe Umzug nach Nijmegen, Sparkasse pushTAN und das Passwort und Furchtbare Passwortrichtlinien bei der Bundesagentur für Arbeit. Manchmal frage ich mich, wer im falschen Paralleluniversum lebt. Bin ich es, und bilde mir nur ein, dass so komplizierte Passwortregeln als kontraproduktiv erwiesen wurden? Oder die Erfinder solcher Vorgaben, die die letzten zehn Jahre oder mehr verschlafen haben?

Dann war ich endlich eingelogged. Ich habe mir die Bahncard herausgesucht, „Lastschrift“ als Zahlart ausgewählt und wollte die Bestellung abschließen. Ich muss nur noch einen kleinen Schritt durchführen, sagt die Bahn-Website.

Identifizierung durch Verimi

Ich muss nur noch meine Identität bestätigen. Wo kämen wir denn hin, wenn ich für jemand anderen eine Bahncard kaufen könnte? Zur Identitätsbestimmung gibt es mehrere Möglichkeiten.

Als Erstes die E-Perso-App, oder wie die heißt. Ich habe zwar gerade einen neuen Perso bekommen, habe das aber noch nicht eingerichtet, außerdem fehlt mir der Chipkartenleser. Also fällt das erst einmal weg.

Als Zweites kann ich Verimi (oder einem anderen Drittanbieter) meine Logindaten für mein Online-Banking geben, dann können die sicher sein, dass ich ich bin. Meine Logindaten. Für Online-Banking.

Kermit der Frosch am Telefon: JA, DIE HABEN ALLE LACK GESOFFEN. NEIN, ICH WEIß NICHT WIE VIEL

Das ganze hat bei mir Flashbacks ausgelöst. Damit musste ich Silvester 2023 auch schon kämpfen, als ich mir ein Deutschlandticket besorgen wollte.

Die dritte Option war, meinen Perso zu Fotografieren und denen gleich auch noch ein Selfie zu schicken. Auch nicht meine Lieblingsvariante, insbesondere nach dieser Geschichte neulich, bei der eine Hotelkette Ausweisdaten gesammelt und nicht gesichert hat. Aber ich brauche diese Bahncard. Nach einigem Herumprobieren (Verimi war pingelig, was die fotografische Qualität meines Ausweises anging) war ich dann identifiziert.

Aber wenigstens kann ich dann endlich mit Lastschrift zahlen, oder?

Die Zahlart

„For the better, right?“ meme. Vier Panels. Panel 1: Anakin: „Du musst dich ausweisen.“ Panel 2: Padme (fröhlich): „Dann kann ich per Lastschrift zahlen, richtig?“. Panel 3: Beat Panel, Anakin schweigt. Panel 4: Padme (zweifelnd): „Richtig?“

Hahaha. Nein.

Die Zahlung konnte nicht durchgeführt werden. Die Zahlung konnte mit dem gewählten Zahlungsmittel nicht durchgeführt werden. Bitte wählen Sie ein anderes Zahlungsmittel.

Ok, dann also Paypal. Ich lese immer wieder von Leuten die schreiben, man solle Paypal nicht benutzen, weil Peter Thiel ein Arschloch ist. Ist er, aber irgendwie muss ich ja meine Bahntickets bezahlen.

Immerhin habe ich jetzt das Bahnticket. Das wird natürlich automatisch verlängert, man kann es, ähnlich wie das Deutschlandticket, nur im Abo kaufen. Zwei Mal bin ich schon darauf hereingefallen, dass ich vergessen habe, die Bahncard zu kündigen, dann habe ich eine Rechnung bekommen, die in den ganzen Ihr-Zug-kommt-zu-spät-oh-nein-doch-nicht-oh-warte-doch-ach-ne-er-fällt-komplett-aus-Spam-Emails untergegangen ist, und statt einer Mahnung haben sie mir dann direkt ein Inkassounternehmen auf den Hals gehetzt, dass eine saftige Strafgebühr verlangt hat. Vielleicht lassen sie mich deswegen nicht per Lastschrift zahlen. Ihr wisst, schon, dann würde das ja automatisch abgebucht und sie bekämen die Strafgebühr nicht.

Dass ich verdammte vier Wochen vor Ablauf kündigen muss, halte ich auch für eine Frechheit. Immerhin werde ich darauf hingewiesen. Und als weiteren Beweis, dass die Bahn unfähig ist, eine Website zu bauen, haben sie ihr HTML auch einmal zu viel escaped und zeigen statt einem Link den rohen HTML-Code an:

Eine Infobox, die die Kündigungsbedingungen der Bahncard erläutert. Darin ist HTML-Code, der wohl ein Link zur Seite mit der Widerrufsbelehrung werden sollte.

Gut, wann schicken die mir meine Bahncard zu?

Digitalzwang

Das war eine Fangfrage. Natürlich schicken die mir keine Bahncard mehr zu. Physische Bahncards haben ausgedient, das hatte ich schon vorher mitgekriegt. Digitalcourage hatte das immer mal wieder angesprochen.

Ich brauche also die DB-Navigator-App. Eine App, die wegen Datenschutz- und Sicherheitsproblemen immer mal wieder in den Schlagzeilen war. Ist aber auch irrelevant, ich kann die App nicht installieren, weil ich den Playstore nicht auf meinem Phone habe. Immerhin kann man mittlerweile ein Ersatz-PDF herunterladen, dass man dann ausdrucken oder auf einem Gerät vorzeigen kann. Aber wo finde ich das?

Es gibt eine Website mit einer laaangen Anleitung, wie man die DB-Navigator-App benutzt. Darunter ein Video, wie man die PDF-Bahncard herunterladen kann. Darunter noch eine „barrierefreie“ Option. Diese Option ist eine PDF-Datei mit vielen Bildern. 9 Seiten lang. 8 Seiten davon eine Anleitung, warum man doch lieber die App verwenden sollte. Auf Seite neun dann fünf kurze Punkte, wo man die Bahncard-PDF-Datei findet (sie ist gut versteckt). Fünf Punkte auf einer Strichpunktliste. This PDF could have been a website.

Naja, jetzt habe ich die Bahncard wenigstens. Und habe schon wieder zwei Stunden verbracht, diesen Blogpost zu schreiben. Ich hatte heute noch etwas anderes vor.

String encoding in Go

(Usually I write stuff in German, but this could be interesting to some people I know who do not speak German, so English it is.)

As frequent readers (do I have those?) know, text encoding is a small hobby / pet peeve of mine. A lot of things would be easier if we just used UTF-8 everywhere. But a consistent text encoding is only useful if it is used correctly and its validity is enforced. Most languages do a bad job at enforcing valid encoding. For example:

  • C does not have strings, C has null-terminated char-arrays. Encoding optional
  • C++ has strings that do not enforce encoding, newer versions have some questionable unicode strings
  • Java encodes strings in UTF-16 and does not check for unpaired surrogates
  • Javascript works similar to Java in that regard

Python and rust enforce valid unicode. Except that python allows to encode surrogate code points (but at least it does fail when it tries to encode that string as UTF-8). However, I'm not here to talk about any of these languages. I'm here to talk about Go, since I'm probably going to use it professionally again next week.

Strings in Go are just gloriefied immutable byte arrays. They have no inherent guarantee to contain a valid string of any encoding. Since Go is such a young language, this is a shame. The worst part: Developers don't expect it. They take a modern language, read strings from external sources, modify them, write them to external sinks and are oblivious about the fact that they are just one step away from splitting a code point in the middle.

I talked about the strengths and weaknesses of Go in another blogpost. Here, I'm going to ask the question: How bad is the situation? What can go wrong, where is easy to make mistakes and where is it hard to do so? Let's start with the basics.

Thing I already knew

Source files in Go are strictly UTF-8. So in theory, string literals are also strictly UTF-8. Unless they are not because you can use escape sequences to do stuff like this:

var s = "foo\xffbar"

There, an invalid byte in the middle of the string. Go has the unicode/utf8 package in its standard library, so we can at least check if the string is valid:

utf8.ValidString(s) // evaluates to false for the string above

You can also just create a string from a byte slice without validation. I have seen many developers doing exactly this, without even thinking about any problems:

c := []byte{0x66, 0x6f, 0x6f, 0xff}
s := string(c)

It should come to no surprise that you can just split a string in the middle of a code point:

s := "🐍"
s1 := s[:2] // s1 now contains an incomplete code point

Just as with casting a byte array to a string, this is something I have seen in the wild several times. Barely anyone thinks about it.

This situation is bad. It is far too easy to get invalidly encoded strings. And Golang is used primarily for web servers. Those get untrusted input all the time. So maybe at least the interfaces that are commonly used are protected? I have never tried this before, so let's do it!

Unicode validation at the border of golang web services

I have written a small test web server for a few test cases. I want to test three interfaces (or two, depending on how you count):

  • URL-parameters for GET requests
  • HTML form data from a POST request
  • JSON data (in this case from POST request, but it does not really matter)

The first two can count more or less as one, because the interface in Golang is the same: A http.Request-object has a field Form (this field needs to be populated by a call to ParseForm(), but that detail does not really matter here). Form is basically a map from parameter name to parameter value(s). So this is what I did:

if err := req.ParseForm(); err != nil {
    response.WriteHeader(http.StatusBadRequest)
    fmt.Fprintln(response, "bad form data")
    return
}

query, ok := req.Form["q"]
// [I left out some validation code here]
if utf8.ValidString(query[0]) {
    log.Printf("query string '%s' is valid utf-8", query[0])
} else {
    log.Println("query string is not valid utf-8")
}
response.WriteHeader(http.StatusOK)
fmt.Fprintln(response, "looks good")

So basically: I try to parse the form data and return an error if any problem occurs. Then I get the string from the form map and log whether it is valid UTF-8. Then I return with a success status code. Ideally, ParseForm() should fail for invalid UTF-8. Let's see what happens:

$ curl "http://localhost:8090/form?q=foo%ff"
looks good

Needless to say, there is a query string is not valid utf-8 message in the server log. And that was the most simple case. POST-body form data has basically the same result, no matter whether I use %ff to escape the byte or use a raw 0xff-byte in the body.

So that's form data. What about JSON? After all, we all write bloated single-page javascript apps with a server that is basically a JSON-API. Does Go's JSON parsing do it better? As a matter of fact, it does! Assume I have this struct

type Input struct {
	Query string `json:"q"`
}

and then handle it like this:

body, err := io.ReadAll(req.Body)
// [omitted error handling]

var input Input
err = json.Unmarshal(body, &input)
// [omitted error handling]

if utf8.ValidString(input.Query) {
    if strings.ContainsRune(input.Query, '�') {
        log.Printf("query string '%s' is valid utf-8 but contains a replacement character", input.Query)
    } else {
        log.Printf("query string '%s' is valid utf-8", input.Query)
    }
} else {
    log.Println("query string is not valid utf-8")
}
response.WriteHeader(http.StatusOK)
fmt.Fprintln(response, "looks good")

No matter what I threw at it, it was always handles gracefully. An escaped surrogate code point? Replaced with the replacement character. An unescaped surrogate code point? Replaced with three replacement characters. An unescaped 0xff-byte? Replaced with the replacement character. An overlong encoding of "}? Replaced with eight replacement characters.

So while I'm a bit unhappy that it does this silently and I have not found an option to let the parsing fail instead of replacing unexpected bytes, this is at least valid behaviour and leads to valid encoding.

Conclusions

Always check strings from untrusted sources for valid encoding. I cannot stress this enough: Most standard library functions will ignore encoding! You have to check manually. json.Unmarshal may have your back, but unless you know for certain that this is the case, always check (in addition to other security measures you should take with untrusted input).

Also: do not split strings in arbitrary places, do not cast byte arrays to strings without checking for valid encoding and be very careful with escape sequences in string literals.

Riesen-Bärenklau, Schafe und Hunde

Als ich neulich bei Verwandten in Essen zu Besuch war und auf dem Rückweg mit dem Fahhrad durch den Ludwig-Kessing-Park gefahren bin, ist mir eine Wiese aufgefallen, auf der überall Riesen-Bärenklau wächst. Auch bekannt als Herkulesstaude. Neophyt, sehr wüchsig, phototoxisch.

Als ich ein Kind war, waren die Wiesen in diesem Park noch frei. Aber schon vor fünfzehn Jahren war diese Wiese eigentlich immer voll mit dem Riesen-Bärenklau. Bis die Stadt dann angefangen hat, Schafe auf den befallenen Flächen weiden zu lassen. Die fressen das Zeug nämlich. Das hat den Riesen-Bärenklau zwar nicht beseitigt, aber immerhin eingedämmt. Aber dieses Jahr habe ich im ganzen Park keine Schafe gesehen. Merkwürdig.

Heute habe ich kurz recherchiert und bin auf diese Pressemeldung der Stadt Essen gestoßen. Kurz zusammengefasst: Auch dieses Jahr werden wieder Schafe zur Bekämpfung eingesetzt. Dazu ein paar Hintergrundinformationen und das hier:

Wichtiger Hinweis für Hundebesitzer*innen: Grün und Gruga weist darauf hin, dass grundsätzlich alle Hunde auf öffentlichen Flächen an der Leine zu führen sind. Ausgenommen hiervon sind besonders gekennzeichnete Hundewiesen. Freilaufende Hunde können die Herde aufschrecken oder gar wildern – das gefährdet nicht nur die Tiere, sondern kann auch zu gefährlichen Situationen führen. So ist nach den letzten Hundeangriffen auf Schafe im vergangenen Jahr die Beweidung im Ludwig-Kessing-Park durch den Schäfer eingestellt worden.

Na toll.

PS: Ich habe vergessen ein Foto zu machen, aber ich glaube, das hole ich noch nach.

GRSSK

(Warnung: Es wird ein bisschen dauern, bis ich zum eigentlichen Thema dieses Blogposts komme)

Heute morgen habe ich aus irgendeinem Grund daran gedacht, dass ich eine digitales Transkript der Beschwerdetafel von Nanni an Ea-nasir haben will. Ea-nasir lebte im 18. Jahrhundert v. Chr. und ist mit dieser Beschwerdetafel zu so etwas wie einer Internetberühmtheit geworden. In der Tafel beschwert sich Nanni über minderwertiges Kupfer beschwerte, dass Ea-nasir ihm verkaufen wollte. Stichwort „ältester Beschwerdebrief der Welt“.

Es gibt einen Unicodeblock Keilschrift mit den Zeichen der Keilschrift, in der der Brief geschrieben war. Ich finde es faszinierend, dass im heutigen Standardzeichensatz auch eine seit tausenden von Jahren nicht mehr benutzte Schrift enthalten ist. Ich finde es auch faszinierend, dass auch vor fast 3800 Jahren die Menschen so waren wie wir heute und sich über ähnliche Dinge gestritten haben, und das wir das durch Schriftzeugnisse belegen können. Ich meine, ja, auch in der Steinzeit waren die Menschen so wie wir, aber sie haben sich nicht über Hänlder beschwert und keine Schriftzeugnisse hinterlassen.

Ich wollte diese beiden Faszinationen also kombinieren und ein Transkript der Tafel haben. Ich bin auf reddit fündig geworden. Nun ist es so, dass ich keine Ahnung von sumerisch-akkadischer Keilschrift habe und weder sagen kann, ob das Transkript korrekt ist noch ob ich den Ausschnit hier vielleicht sogar mitten im Wort abgeschnitten habe:

𒀀 𒈾 𒂍 𒀀 𒈾 𒍢 𒅕
𒆠 𒉈 𒈠
𒌝 𒈠 𒈾 𒀭 𒉌 𒈠
𒀀 𒉡 𒌑 𒈠 𒋫 𒀠 𒇷 𒆪
𒆠 𒀀 𒄠 𒋫 𒀝 𒁉 𒄠

Der eigentliche Grund, warum ich diesen Blogpost schreibe, ist aber diese Absurdität. Sie nimmt im Prinzip lateinische Buchstaben und gibt als Ausgabe die visuell am besten passenden Keilschriftzeichen aus. Beispiel: „HALLO“ wird zu „𒀂𒋻𒁇𒁇𒆸“. Warum nervt mich das so? Eigentlich ist es ja künstlerisch ganz nett. Es bedeutet halt nur etwas völlig Anderes. „𒀂“ ist kein „H“ sondern (nach moderner Bezeichnung) „A×BAD“. „𒀂𒋻𒁇𒁇𒆸“ ist also Nonsens, der so aussieht wie lateinische Schrift. Und damit sind wir endlich beim Thema dieses Blogposts angekommen.

GRΣΣΚ

Zum ersten Mal bewusst begegnet ist mit das im Webcomic Cerintha. Dort steht der Schriftzug:

ΝΣΑ RΟΜΑ

Das ist jetzt ein gemisch aus griechischen und lateinischen Buchstaben. Es soll vermutlich „NEA ROMA“ heißen. Spätestens beim großen Sigma (Σ) ist aber Schluss damit. Die anderen Zeichen können noch als lateinisch durchgehen. Sigma ist aber definitiv griechisch und so etwas wie das lateinische S. Ich kann kein griechisch, aber in der Mathematik kommen einem ja immer wieder die griechischen Buchstaben unter, so zum Beispiel das Summenzeichen Σ. „S“ wie „Summe“. Leicht zu merken. Der Schriftzug heißt also eher „NSA ROMA oder „NSA ROUMA“, je nachdem, bei welchen Buchstaben man lateinische und bei welchen man griechische Schrift annimmt. „R“ und „Σ“ sind die einzigen die nicht von der Form her in beiden Schriften vorkommen, die Lage ist also ambig.

Damals hielt ich das für eine Kuriosität, einen Einzelfall. Jemand wollte antik und griechisch aussehen und hat es verbockt. Springen wir zehn Jahre nach vorne, und der Spielleiter einer meiner Rollenspielrunden nerd-sniped mich, indem er das subreddit /r/grssk erwähnt. Ein ganzes Subreddit, dass sich nur über die Misshandlung des griechischen Alphabets lustig macht. Zumeist irgendwelche englischen Worte oder Schriftzüge, die cool Aussehen sollen, aber einfach nur falsch sind.

Besonders beliebt sind neben dem Ersetzen von „E“ durch „Σ“:

  • Ersetzen von „E“ durch „Ξ“ (Xi, wird wie das deutsche X ausgesprochen)
  • Ersetzen von „A“ durch „Λ“ (Lambda, wie das deutsche L) oder durch „Δ“ (Delta, wie das deutsche D)
  • Ersetzen von „O“ durch „Θ“ (Theta, wie das deutsche TH, aber nicht wie das Englische TH)
  • Ersetzen von „Χ“ durch „Χ“ (Chi, wie das deutsche KH)
  • Ersetzen von „Y“ durch „Ψ“ (Psi, wie das deutsch ps), besonders ironisch, weil das Y aus dem griechischen Alphabet stammt, dort immer noch ist und in der französischen Sprache sogar „i grec“ – „griechisches i“ heißt
  • Ersetzen von „n“ durch „π“ (Pi, das sollte nun wirklich jeder kennen)
  • Ersetzen von „p“ und „P“ durch „ρ“ und „Ρ“ (Rho, mehr so wie ein R)

In dem subreddit gibt es eine ganze Menge lustiger Beispiele. Am bekanntesten ist jedoch „GRΣΣK“, mit dem oben benannten Sigma also „GRSSK“.

Habe ich gesagt, mir dieses Phänomen zum ersten Mal bei Cerintha untergekommen ist? Das stimmt nicht ganz. Im Buch Fool on the Hill des Autors Matt Ruff kommt eine übel beleumundete Studentenverbindung vor. Diese zeichnet sich durch Rassismus, Vergewaltigungen und allgemeiner Gewalttätigkeit aus. Ihr Name ist Rho Alpha Tau (ich verstehe das mit den amerikanischen Studentenverbindungen und den griechischen Buchstaben nicht, ist das wirklich ein Ding?). In Buchstaben: ΡΑΤ. Der Gründer der Verbindung namens Patrick Baron wollte sich hier verewigen. Da der erste Buchstabe aber ein Rho war, und die Verbindung ihren schlechten Ruf schnell erworben hatte, wird sie im ganzen Buch nur die „Rattenschaft“ genannt.

Ist diese Misshandlung der griechischen Schrift wirklich so schlimm? Vermutlich nicht. Mir geht es nur sehr auf die Nerven, wenn ich so etwas sehe. Schreibt euren Krams vernünftig. Wenn ihr warum auch immer (Marketing?) unbedingt eine Schrift haben wollt, die „griechisch“ aussieht, aber lateinisch ist, dann nehmt euch halt eine entsprechende Schriftart und nutzt nicht die griechischen Buchstaben, wenn ihr nicht wisst, wie. Ansonsten hat man einen klassischen Fall von „as long as it looks foreign“.

Das Urban Dictionary definiert „Grssk“ als:

A gross misuse of THξ GRΣΣK ΛLPHΛβξT (Thks grssk llphlbkst)

Tengwar

Ein verwandtes Problem gibt es mit der tolkienschen Elbenschrift Tengwar. Der große Unterschied hier ist, dass es diese Schrift nicht in den Unicode-Zeichensatz geschafft hat (und es vermutlich auch nicht wird). Zwar gibt es im Rahmen des ConScript-Projekts einen Vorschlag, wie man die Schrift in der Private Use Area von Unicode unterbringen kann, aber das ist, wie der Name sagt, nicht für den allgemeinen Gebrauch und nur für den Textaustausch zwischen speziellen Programmen (und kann von anderen Programmen anders interpretiert werden).

Es gibt aber einige Schriftarten, mit denen lateinische Buchstaben und ein paar Sonderzeichen als Tengwar dargestellt werden können. Dabei muss man jedoch die Schrift beherrschen. Der oben verlinkte Artikel gibt ein Beispiel: Wenn man „Ardapedia“ eintippt und die Schriftart zu Tengwar ändert, steht dort nicht „Ardapedia“ sondern eher etwas wie „schvschntschfschstsch“. Man muss also wissen, was man macht, und für Computer sieht es aus wie beliebiger ASCII-Text.

Barrierefreiheit

Eine letzte Warnung noch: Die meisten oben genannten Beispiele sind schlimmstenfalls unschön. Auf Mastodon habe ich jedoch ein paar sehbehinderte Menschen gesehen, die sich über kreativ codierte Anzeigenamen beschwert haben. Natürlich sticht es ins Auge, wenn dein Benutzername statt „Knirps“ „sdɹıuʞ“ oder „𒐞𒐖𒐕𒇲𒇬𒔼“ lautet, aber wenn jemand mit einem Screenreader daherkommt und sich die Website vorlesen lässt, dann hört diese Person eher so etwas wie eine Auflistung der Code-Points, weil der Screenreader keine Ahnung hat, wie er damit umgehen soll.

Also achtet bei aller kreativen Energie bitte auch darauf, dass eure Texte auch für Screenreader lesbar sind.

Lego-User-Experience

Mir ist diese Woche ein Artikel aus 2020 untergekommen: The UX of LEGO Interface Panels. Der Autor nimmt dabei einen ganzen Haufen verschiedener Legosteine, auf die verschiedene Bedien-/Kontrollelemente aufgedruckt sind (als UI für die Legofiguren) und untersucht sie auf verschiedene Aspekte.

Fast nebenbei erklärt er dabei, nach welchen Regeln man solche Schnittstellen entwirft, welche Vor- und Nachteile die jeweiligen Ansätze haben und was man nicht machen sollte. Wer also Klemmbausteine mag und eine kurzweilige Einführung in UI/UX-Design haben möchte, sollte sich diesen Artikel durchlesen.

Manic Miners

Im Jahr 1999 kamen die Rock Raiders-Legosets auf den Markt. Das waren verschiedene Fahrzeuge (und ein Hauptquartier) mit einem Bergbauthema. Die Hintergrundgeschichte: Das Bergbauraumschiff LMS Explorer hat es durch eine Verkettung unglücklicher Umstände in eine andere Galaxie verschlagen, wo sie jetzt mit fast aufgebrauchten Energiereserven herumdümpelt. Glücklicherweise gibt es auf einem Planeten in der Nähe große Vorkommen von Energiekristallen. Mit denen kann man das Schiff wieder flott machen. Diese Energiekristalle müssen aber erst einmal abgebaut werden. Zu den ganzen üblichen Problemen des Bergbaus (Bewetterung, Einstürze, Magma) kommen aber auch aggressive Lebensformen (Rockmonster) dazu, die sich von diesen Energiekristallen ernähren und zu Futterneid neigen.

Die Lego-Sets waren ganz nett, bei den meisten davon gab es auch jeweils einen kleinen Comic dabei. Wirklich begeistert für das Setting habe ich mich aber erst im Jahr 2000, als ich das dazugehörige Computerspiel bei einem Besuch um Legoland Billund kennenlernte. Ein Freund von mir war auch sehr begeistert von dem Spiel. Ich habe das Spiel dann auch zum Geburtstag bekommen, unser alter Rechner damals hatte aber keine 3D-Grafikkarte, deswegen konnte ich da Spiel nur bei Freunden spielen.

Rock Raiders: Das Computerspiel

Das Spiel war eine Art Aufbaustrategiespiel. Es gab einzelne Missionen, man startete üblicherweise in einer kleinen Höhle, musste sich Legomännchen (die namensgebenden Rock Raiders) herunterteleportieren, Wände anbohren um an Erz und Energiekristalle zu kommen, Gebäude bauen, um kleinere und größere Minenfahrzeuge herunterzuteleportieren, die einem halfen, Rohstoffe schneller zu transportieren, schneller durch härteres Gestein kamen, Schutt wegräumen oder über Wasser und Lava fliegen konnten. Ziel war es meist, eine bestimmte Anzahl Energiekristalle zu sammeln, manchmal musste man aber auch verschollene Rock Raider oder eine bestimmte Höhle finden. Die Rock Raider, die man hatte konnte man ausbilden, so dass sie zum Beispiel Fahrzeuge benutzen, mit Sprengstoff umgehen oder als Geologen fungieren konnten. Man konnte ihnen auch Namen geben.

Erschwert wurde das ganze durch verschiedene Faktoren. In den meisten Missionen war nur begrenzt Sauerstoff verfügbar, man musste also schnell ein Gebäude bauen, um die Luft aufzufrischen. Wände konnten nachgeben, was Rock Raider, Fahrzeuge oder Gebäude beschädigen konnte und außerdem einen Schutthaufen hinterließ, den man wegräumen musste. Die Wände mussten also abgestützt werden. Auf manchen Karten breitete sich ein Magmasee aus, dessen Ausbreitung man mit bestimmten Methoden verlangsamen (aber nicht stoppen) konnte.

Auch die oben genannten Rockmonster tauchten auf, auch in einer in den Lego-Sets nicht vorkommenten Lavamonster und Eismonster-Version. Die wollten an die Energiekristalle, die man für den Betrieb von Gebäuden und Fahrzeugen brauchte. Dafür schlugen sie die Gebäude kaputt und warfen Rock Raider, die ihnen in die Quere kamen, durch die Gegend. Gegen die konnte man sich mit Eletrozäunen wehren, oder man rüstete die Rock Raider mit Lasern oder anderen Waffen aus. Es gab auch harmlosere, aber nicht weniger nervige Fauna. Schleimschnecken machten keine Gebäude kaputt, sondern tranken einfach die Energie aus ihnen heraus. Fledermäuse, vom Bohrlärm und Licht aufgeschreckt, versetzten die Rock Raider in Angst und Schrecken (dabei waren sie harmlos). Höhlenspinnen produzierten zur Verteidigung ein glitschiges Sekret, auf dem die Rock Raider ausrutschten (normal nur nervig, aber problematisch, wenn der Rock Raider gerade vor einer Sprengung wegläuft).

Es war ein schönes Spiel, aber es gab auch einige weniger schöne Seiten.

Probleme mit dem Rock Raiders-Spiel

Zum Einen waren da technische Probleme. Man konnte nur nach einer abgeschlossenen Mission abspeichern. Das Spiel neigte aber dazu, ohne Vorwarnung abzustürzen. Wurde ein Rock Raider beim Aufstellen eines Zauns unterbrochen, dann wurde der Zaun nicht aufgestellt, man konnte an der Stelle auch nie wieder einen Zaun aufstellen. Schleimschnecken hauten entweder sofort wieder ab oder ließen sich ums Verrecken nicht vertreiben. Hatte man beim Bau eines Gebäudes nicht genug Rohstoffe im Lager, wurde der Lagerstand implizit negativ, und die Rock Raider mussten später denselben Erzbrocken mehrmals aufheben und wieder ablegen, um das zu beheben. Schickte man aus Versehen zwei verschiedene Rock Raider in dasselbe Fahrzeug, blieb ein Rock Raider in einer Schleife stecken, in der er versuchte, das schon besetzte Fahrzeug zu benutzen und war zu nichts mehr zu gebrauchen.

Zum Anderen waren da aber die spielmechanischen Probleme und Unschönheiten. Nur ein paar Beispiele:

  • Die KI der Rock Raider war nicht besonders gut. Rock Raider neigten z.B. dazu, sich ihre Aufgaben so auszusuchen, dass sie die maximale Distanz zwischen ihnen zurücklegen mussten. Bei der Benutzung von Sprengstoff blieben sie oft zunächst stehen und liefen erst dann panisch weg, wenn der Countdown schon halb runtergezählt war.
  • insbesondere war die Wegesuche der Rock Raider schlecht. Sie nahmen immer den kürzesten Pfad, egal, ob der über eine gebaute Straße, den Höhlenboden oder einen Geröllhaufen führte. Auch neigten sie dazu, in Lava reinzulaufen.
  • insbesondere: hatte man zwei Bereiche, die nicht über den Landweg verbunden waren, spielte die Wegesuche auch verrückt
  • Die Balance bei den Waffen war nicht gegeben. Rock- und Eismonster ließen sich mit einem Schuss aus einer Laserpistole besiegen. Gegen Lavamonster halfen am Besten Eisstrahler. Schubstrahler oder Soundblaster waren völlig nutzlos
  • Rock Raider, die auf ein Monster schießen wollten, stellten sich so hin, dass das Monster gerade eben nicht in Schussreichweite war. Bewegte sich das Monster auf sie zu, war das kein Problem. Bewegte es sich weg oder überhaupt nicht, traf der Rock Raider nie.
  • Die meisten Fahrzeuge waren nutzlos. Die härteste Gesteinsart ließ sich nur vom besten Minenfahrzeug (und von Dynamit) durchbohren). Kleinere Minenfahrzeuge waren nur nützlich, um schneller durch die Gesteine zu kommen, durch die ein Rock Raider auch mit dem Handbohrer kam. Minenlaser waren völlig unbrauchbar, sie kamen nicht durch das härteste Gestein und verbrauchten zudem noch Energiekristalle. Der Hoverscout, das einfachere Fluggerät, war zwar sehr schnell, konnte aber nicht über Wasser oder Lava fliegen und außer einem Rock Raider nichts transportieren.
  • manche Fahrzeugupdates waren schlimmer als nutzlos: So konnte man einem Schaufellader Lagerfläche zum Rohstofftransport anbauen. Der Schaufellader war aber langsamer als der kleine Transporter und hatte weniger Transportkapazität. Außerdem vernachlässigte er durch den Transport von Rohstoffen seine eigentliche Aufgabe: Das Räumen von Abraum
  • Rock Raider mussten regelmäßig essen oder blieben alle paar Schritte stehen, um sich auszuruhen. Man konnte das manuell machen, dann zauberten sie eine Stulle hervor und aßen sie. Sie machten es auch automatisch, dann mussten sie aber den ganzen Weg zur Versorgungsstation zurücklegen. Auf in einer Mission mussten Rock Raider einen sehr langen weg zurücklegen, kamen aber nie an, weil sie unterwegs immer Hunger bekamen und zurück zur Basis gingen.
  • Die Anzahl der Missionen war stark eingeschränkt. Man kam nur selten dazu, ein vollständiges Hauptquartier aufzubauen, weil das Missionsziel schon vorher erreicht war. Selbst in der letzten Mission gab es eine Abkürzung, um sehr schnell an sehr viele Energiekristalle zu kommen.
  • Die eingeschränkte Anzahl der Missionen sorgte dafür, dass viele interessante Spielmechaniken nie wirklich zum Einsatz kamen, weil sich die Gelegenheit nicht ergab.
  • Ein Fahrzeug, ein Senkrechtstarter, der auch Fahrzeuge transportieren könnte, war nicht verfügbar und tauchte nur in einer Mission als Missionsziel auf.

Insgesamt also einige Probleme und viel ungenutztes Potential. Es hat sich auch schon eine Modding-Community zu dem Spiel gebildet, die zum Beispiel neue Missionen entwickelt hat. Aber ein Fan hat sich die Aufgabe gemacht, ein komplettes Remake in einer modernen Game-Engine (Unreal Engine) zu entwickeln. Er hat damit 2009 angefangen und ist im August 2023 fertig geworden.

Manic Miners

Dieses Remake heißt Manic Miners. Und es ist wirklich beeindruckend. Ich habe es kurz nach Erscheinen gespielt und war begeistert. So begeistert, dass ich meine Zeit darauf verwendet habe, es zu spielen anstatt einen Blogpost darüber zu schreiben. Deswegen kommt der jetzt erst.

Das Spiel läuft stabiler. Die KI ist besser. Das Balancing ist besser. Die ganzen nutzlosen Fahrzeuge haben jetzt unterschiedliche Eigenschaften, die sie für verschiedene Einsatzzwecke nützlicher macht. Es gibt mehrere neue Kampagnen und einen Leveleditor. Der Grafikstil ist der gleiche wie im Original, aber die Grafikqualität ist um Größenordnungen besser. Man kann die Rock Raider nicht nur benennen, sondern ihre Lego-Minifiguren auch mit vielen Optionen anpassen. Es werden auch Skins aus anderen alten Legosets angeboten, z.B. aus Ice Planet 2002:

3D-Grafik einer Lego-Minifigure aus dem Ice Planet 2002-Set. Die Figur ist in Blau und Schwarz gehalten. Sie trägt einen weißen Helm mit einem Neonorangen Visier mit Antenne.

Kurz: Der Charme und die Atmosphäre des Ursprungsspiels blieben erhalten, es läuft deutlich stabiler und nutzt viel des Potentials, das im Original nicht genutzt wurde. Und es wurde von einer einzelnen Person entwickelt.

Ich kann nur empfehlen dieses Spiel auszuprobieren. Es kostet nichts (sonst würde Lego dem Entwickler vermutlich auch das Leben schwer machen). Der Entwickler will auch keine Spenden. Wenn ihr ihn also wertschätzen wollt, dann spielt das Spiel und empfehlt es weiter wenn es euch gefällt.

Toilette? Server error.

Heute bin ich mal wieder mit der Bahn nach Hause gefahren. Da mir mal wieder der Bauch ein bisschen grummelte, wollte ich sicherheitshalber am Bahnhof (ein großer Hauptbahnhof) noch einmal auf Toilette gehen.

Das öffentliche Toiletten eine per Automat eine Gebühr nehmen, hat sich ja in den letzten Jahren immer weiter verbreitet. An Autobahnraststätten sowieso, an Bahnhöfen aber auch. Der erste Schock war, dass der Preis (in einer Anlage der Marke „rail & fresh“ dafür mittlerweile bei 1,5 € ist. Ein Euro Fünfzig. Das ist eine Menge.

Aber notgedrungen habe ich dann halt Geld herausgekramt und angefangen, einzuwerfen. Das 50-cent-Stück schluckte der Automat noch ohne Protest, der Restbetrag sank auf 1 €. Das 1-Euro-Stück wollte der Automat nicht und spuckte es wieder aus. Ich warf es wieder ein. Er spuckte es wieder aus. Etwa zwanzig Versuche später wollte ich aufgeben und den zweiten Automaten nehmen. Also drückte ich auf den „Abbruch“-Knopf. Nichts passierte. Weder kriegte ich mein Geld zurück, noch wurde der Vorgang abgebrochen, ohne mir das Geld zurückzugeben. Der Automat hatte sich aufgehängt.

Unter dem Display des Automaten stand die Nummer der Service-Hotline, die man in Störfällen anrufen soll. Unter dieser Nummer antwortete mir eine der typischen „For Inconvenience, Press "1"“-Automatenstimmen. Ich hörte mir an, was die Stimme zu sagen hatte und wählte die 2.

Das Gespräch wurde beendet, auf meinem Telefon blitzte kurz die Nachricht „Server error. Try again later.“ auf. Wow. Das ist neu. Vielleicht ein Hiccup, probieren wir es noch mal. Beim zweiten Versuch funktionierte es dann. Nach der 2 kam dann wieder eine Stimme vom Band, die mir sagte, falls ein Automat mein Geld geschluckt habe und ich es zurückerstattet haben möchte, soll ich eine Mail an die Mailadresse der Hering Sanikonzept GmbH schicken. Das wollte ich nicht, ich wollte ja Support für mein akutes Problem, also drückte ich nach einem langen Ansagetext noch einmal die 2.

Da war dann erstaunlich schnell (innerhalb von wenigen Sekunden) ein Mensch in der Leitung. Ich schilderte dieser Person mein Problem. Die Person meinte, sie hätte schon eine Störmeldung von diesem Bahnhof bekommen, erreiche dort aber niemanden, vermutlich, weil Pfingstmontag ist. Ich bedankte mich und legte auf.

Ich hatte nun nicht mehr genug Kleingeld, um den anderen Automaten zu bedienen. Das Ding hatte auch eine Kartenzahlfunktion, aber nach dem Erlebnis mit dem ersten Automaten wollte ich meine Karte nicht in die Nähe eines solchen Autmaten lassen. Ich entschied, dass ich doch nicht so dringend auf Toilette musste, ging zum Gleis und wartete dort auf meinen Zug. Der hatte dann übrigens eine Toilette.

Schreibe ich jetzt für diese 50 cent eine Mail? Ja. Mich hat das so genervt, da soll die Sanikonzept GmbH gerne die ganze Arbeitszeit und den Aufwand betreiben, um mir diesen Kleinstbetrag zu überweisen. Wenn das genug Leute machen, wird das für die vielleicht so teuer, dass sie stattdessen lieber ihre Qualitätssicherung verbessern.

PS: um die Beschwerde abzuschicken und auch, um die Mailadresse oben anzugeben, habe ich gerade noch ein paar (27) Mal versucht, die Hotline anzurufen um die Bandansage, in der die Mailadresse genannt wird, noch einmal zu hören. Bisher war es jedes Mal ein Server error. Offensichtlich war der Server error nicht der Hiccup, sondern dass ich durchgekommen bin. Vielleicht war deswegen auch so schnell ein Mensch in der Leitung. Ich habe jetzt die Mailadresse genommen, die in der Ansage bevor ich das erste Mal eine Zahl drücken muss, genannt wird.

Slack und Emojis

Als ich Anfang der Woche Kollegen über Slack die Sache mit dem Unicode in Bezeichnern in C und C++ mitteilen wollte, machte Slack ein paar Sachen, die mich verärgert haben. Wer dieses Blog liest kann sich sicher denken, dass aus einem Post so schnell ein Rant mit acht oder mehr Posts wurde. Aber fangen wir mal ganz am Anfang an.

Webforen, Emoticons und Smileys

Als ich in den frühen 2000ern mit dem Internet angefangen habe, waren zwei Dinge sehr verbreitet: Emoticons wie „:)“ und Webforen. Beides gibt es auch heute noch, hat aber im Vergleich zu Emojis und zentralisierten Social Media an Bedeutung verloren. Unicode gab es schon einige Jahre, war aber an vielen Stellen noch nicht angekommen. Emojis gab es noch nicht.

In den meisten Webforen wurden Emoticons automatisch durch kleine Bilder ersetzt. Ein „:)“ zum Beispiel wurde also durch ein Bild ersetzt, dass so ähnlich aussah, wie das heutige „🙂“-Emoji. Es war aber kein Emoji, sondern einfach ein Bild in der Website. Die Ersetzung war üblicherweise ein einfaches Suchen-und-Ersetzen. Das führte manchmal zu Problemen, wenn Zeichenfolgen durch Bilder ersetzt worden, wo es die Verfasser_in eines Posts nicht gedacht hatte. In den meisten Forensoftwares konnte man diese Ersetzen-Funktion auch abschalten.

Instant Messenger wie ICQ oder Skype haben das ähnlich gemacht.

Slack

Slack hat sich in den letzten zehn Jahren in vielen Firmen, aber auch bei uns an der Uni, als Kommunikationssystem verbreitet. Slack ist so eine Art Chatsystem/Instant Messenger, und Emoticons werden hier auch durch etwas anderes ersetzt. Auch das kann man abstellen. Ich habe das abgestellt, weil es mir auf die Nerven ging. Trotzdem poste ich gelegentlich auch mal Dinge mit Emojis.

Für die meisten Nutzer ist das irrelevant, aber Emojis sind nicht „kleine Bilder im Text“. Emojis sind Teil des Textes. Sie haben eigene Code Points in Unicode. Manchmal sind sie auch durch mehrere Code Points zusammengesetzt, das ist hier irrelevant. Der große Vorteil ist: Man kann sie durch Text-Only-Schnittstellen schieben (so lange diese Schnittstellen irgendein Unicode-Encoding verwenden) und muss keine komplizierten Escape-Sequenzen, die dann jede Software anders machen würde.

Slack macht das trotzdem. Slack ersetzt zum Beispiel „🙂“ durch „:slightly_smiling_face:“ oder „🏴‍☠️“ durch „:pirate_flag:“. Der Slack-Client fügt dann anstelle dieses Codes ein <img>-Tag ein. Auch das wäre vielleicht noch zu verzeihen. Aber im alt-Attribut dieses Tags steht dann nicht „🏴‍☠️“ sondern „:pirate_flag:“.

Wenn man jetzt also Text aus Slack kopiert, dann steht mitten im Text anstatt eines Emojis eine Slack-spezifische Escape-Sequenz. Und hier fängt der Ärger für mich richtig an. Mir sind da innerhalb von wenigen Minuten mehrere Probleme aufgefallen:

  • Wie schon gesagt, man kann Texte nicht einfach aus Slack herauskopieren. Ein Round-Trip (kopiere Text nach Slack, kopiere ihn wieder heraus) verändert den Text.
  • Die Ersetzung wird auch in Code-Blöcken gemacht. In meinem Beruf schickt man sich gerne mal Code-Snippets zu. Wenn dann let p = "🏴‍☠️" durch let p = ":pirate_flag:" ersetzt wird, wird der Code verändert.
  • Die Ersetzung ist nicht einmal konsistent. So wird zum Beispiel außerhalb von Code-Blöcken „☺“ durch „:relaxed:“ ersetzt, innerhalb von Code-Blöcken nicht. Die oben erwähnte Piratenflagge wird zwar ersetzt, aber (immerhin) innerhalb von Code-Blöcken nicht durch ein <img>-Tag dargestellt.
  • Unterschiedliche Emojis werden durch die gleiche Escape-Sequenz ersetzt. Zum Beispiel werden „☠“ (U+2620) und „☠️“ (U+2620,U+FE0F) beide mit „:skull_and_crossbones:“. Eine verlustfreie Umwandlung ist also nicht einmal möglich, wenn ich die Escape-Codes von Slack in Betracht ziehe.

Fun Facts

Genug geschimpft. Was machen wir? Nun, vermutlich müssen wir das so hinnehmen. Ich habe nach einem Weg gesucht, das abzuschalten, habe aber nur gefunden, wie man das Ersetzen von Emoticons abschaltet.

Wo wir gerade von dem Ersetzen von Emoticons reden: Ich habe bei meinem alten Arbeitgeber manchmal Slack-Benachrichtigungen per E-Mail bekommen (nein, nicht nach Feierabend). Eine Kollegin hat immer den klassischen Lächel-Smiley :) verwendet. Nach der ursprünglichen Idee von Emoticons sollen damit Gesichtsausdrücke emuliert werden um diesen Teil der nonverbalen Kommunikation zumindest ein bisschen einfließen zu lassen. Bei Text weiß man oft nicht, ob die andere Seite jetzt fröhlich ist, neutral oder ein bisschen genervt. Ein „:)“ stellt sicher, dass die Zielperson die Bemerkung nicht in den falschen Hals kriegt.

Dummerweise ersetzt Slack das durch „:slightly_smiling_face:“. Und da in E-Mails keine <img>-Tags vorkommen, steht dann „:slightly_smiling_face:“ in der Mail, ohne ein Bild, wie das aussieht. Mein Kopf macht daraus dann ein Bild von einem „es ist mir ein bisschen peinlich das ansprechen zu müssen aber du hast einen Fehler gemacht“-Lächeln. Das war aber nicht die Botschaft, die mir die Kollegin senden wollte.

Dieser Arbeitgeber (auch mein zukünftiger Arbeitgeber) hat 2015 (oder 2016, aber ich glaube es war 2015) Slack eingeführt, geht aber demnächst wohl wieder von Slack weg. Aus Datenschutz/Datensicherheitsgründen.

Zum Abschluss noch einen Punkt für Slack: Slack erlaubt auch benutzerdefinierte „Emoji“ (technisch gesehen keine Emojis). Da können Benutzer dann kleine Bilder hochladen und mit einer eigenen Escape-Sequenz versehen. Hier ist die Nutzung der Escape-Sequenzen tatsächlich angebracht. Und man kann schon ein bisschen Spaß damit haben.

Unicode-Bezeichner in C und C++

Vor ein paar Tagen habe ich herausgefunden, dass man für Bezeichner in C und C++ auch nicht-ASCII Unicode Code Points verwenden darf. Mit Einschränkungen.

Es ist leider ein bisschen schwierig, definitive Informationen dafür zu finden. Für C++ sieht die Lage recht eindeutig aus: auf cppreference.com gibt es eine Liste von Zeichen die am Anfang oder nicht am Anfang von Bezeichnern zugelassen sind.

Für C habe ich keine so schöne Auflistung gefunden. Im Wikipedia-Artikel über C steht, dass ab C99 Escape-Sequenzen für Unicode in Bezeichnern zugelassen ist und dass auch vorgeschlagen wird, direkte Unicode-Code Points zuzulassen. Was genau erlaubt ist steht dort nicht.

Ich habe versucht, in den ISO-Standard zu schauen. Um darauf zuzugreifen müsste ich aber ordentlich blechen. Vielleicht kriege ich den auch irgendwo kostenlos zu sehen, aber die Mühe war mir diese Spielerei nicht wert. Auf gnu.org gibt es auch ein paar Anmerkungen zu Unicode in Bezeichnern, aber Details sind hier auch nicht gegeben.

Für's Erste nehme ich also an, dass die Regeln die gleichen sind wie bei C++.

Beispiele

Ich habe das natürlich ausprobiert, sowohl für C als auch für C++. Zuerst der C-Code:

#include <stdio.h>

int main(int argc, char **argv) {
    int äöü = 42;
    float π = 3.14;
    char 茶[] = "tea";

    printf("äöü: %d\n", äöü);
    printf("π: %f\n", π);
    printf("茶: %s\n", 茶);
    printf("茶: %s\n", \u8336);

    return 0;
}

Ein vergleichbares C++-Programm:

#include <iostream>
#include <string>

int main(int argc, char** argv) {
    int äöü = 42;
    float π = 3.14;
    std::string 茶 = "tea";

    std::cout << "äöü: " << äöü << std::endl;
    std::cout << "π: " << π << std::endl;
    std::cout << "茶: " << 茶 << std::endl;
    std::cout << "茶: " << \u8336 << std::endl;

    return 0;
}

Ich kann deutsche Umlaute verwenden, griechische Buchstaben und auch chinesische Schriftzeichen. Ich kann auch Escape-Sequenzen anstelle der Code Points verwenden: \u8336 ist das Gleiche wie .

Nicht erlaubt sind z.B. oder 🏴‍☠️ (die Piratenflagge sind auch nicht nur ein, sondern vier Code Points, aber das ist eine andere Geschichte).

Nun ist es leider so, dass historisch betrachtet die verschiedenen C- und C++-Compiler trotz eines einheitlichen Standards immer wieder leicht unterschiedliche Meinungen dazu hatten, was erlaubt ist und was nicht. Ich habe den code mit gcc 13.3.0 und clang 18.1.3 getestet, bei beiden lief er ohne Probleme.

Sicherheitsimplikationen

Erst im Nachhinein ist mir aufgefallen, dass das auch Sicherheitsimplikationen hat. Ich hatte ja neulich schon über Homograph-Attacken im Quellcode geschrieben. Da ging es aber mehr um Stringkonstanten als um Bezeichner. Bei den Bezeichnern ist weiter eingeschränkt, was erlaubt ist, aber vielleicht gibt es ja trotzdem Homoglyphen.

Der Schutz vor solchen Attacken dürfte ähnlich sein wieder Schutz vor Homograph-Attacken. Vermutlich ein bisschen einfacher, weil es einfacher ist, nicht-ASCII in Bezeichnern zu verbieten als in Stringkonstanten.

Fazit

Nicht-ASCII-Unicode in Bezeichnern in Programmiersprachen ist eine nette Sache. Ich würde aber in keinem Projekt, in dem ich etwas zu sagen hätte, welche zulassen. Weniger wegen der Sicherheitsbedenken (darauf muss man sowieso achten) sondern aus praktischen Gründen. Sehr oft arbeitet man mit Menschen aus unterschiedlichen Ländern zusammen. Was ist mit denen, die keine Umlaute auf der Tastatur haben? Müssen die die Variablennamen immer kopieren? Vielleicht die Compose-Key verwenden? Noch schwieriger wird es mit griechischen Buchstaben wie π oder chinesischen Zeichen wie 茶. Wie soll man die eintippen?

Umgekehrt: welchen Vorteil hat der Einsatz von nicht-ASCII-Unicode? Ok, man kann die Konstante für π als griechischen Buchstaben schreiben. Aber man löst damit kein wirklich bestehendes Problem. Also lasst es lieber bleiben und betrachtet das hier als Kuriosum.