Es hat alles damit begonnen, dass Andy und ich uns überlegt haben:
Du sage mal, bei den Telefontasten. Da ist ja „A“ gleich einmal die [2] drücken, „B“ gleich zweimal die [2] drücken, usw. Und wo das Leerzeichen ist, können wir wählen: Taste [0] oder [1]. Aber wenn die Taste [0] das Leerzeichen ist, wie gibt man denn das Zeichen „0“ ein?
Eigentlich kann man die Frage leicht entscheiden, indem man sagt: Man tippt einfach zweimal auf die Taste [0]. Aber ich hatte jetzt Lust, das genauer zu erforschen und fragte euch, unsere User. Und tatsächlich, @radioscout antwortete – und trat damit unwissentlich eine Lawine los. Er hatte drei verschiedene Handys zur Überprüfung zur Verfügung: ein Nokia, ein Siemens und ein Samsung.
Zusammen versuchten wir nun, zu ergründen, wie die Handys eigentlich funktionierten. Wo waren die Leerzeichen, wo waren die Sonderzeichen versteckt? Ziemlich schnell erkannten wir, dass alle drei Geräte sich komplett unterschiedlich verhielten. Die Tastenbelegungen waren anders, nicht nur bei den Leerzeichen, auch was die Ziffern und vor allem aber auch die Sonderzeichen betraf. Beispielsweise haben wir bisher die Reihenfolge der Tastenbelegungen so gehandhabt:
- Grundbuchstaben (also die Buchstaben, die i.d.R. auf den Tasten abgedruckt sind, bspw. „ABC“)
- Die Ziffer der Taste (hier also die 2)
- Und danach optional noch ein paar Sonderbuchstaben (hier bspw. das Ä)
Nun, die Belegungen von @radioscout offenbarten aber, dass die Ziffern keineswegs immer direkt nach den „Grundbuchstaben“ kommen, wie das Beispiel des Samsung-Gerätes zeigt:
2: A B C Ä Å Æ Ç Γ 2
Noch interessanter wurde es, als man die Groß- und Kleinschreibung betrachtete. Hier einmal das Siemens-Gerät:
2: a b c 2 ä à ç æ å
2: A B C 2 Ä Æ Å
Wie man sehen kann, kann man im Kleinschreib-Modus tatsächlich andere Zeichen tippen als im Großschreib-Modus.
Nun war mein Ehrgeiz geweckt und @radioscout wurde von mir unbarmherzig zu allen möglichen Details ausgequetscht. Das wichtigste dabei war: Wie wechselt man eigentlich von Groß- zu Kleinschreibung? Die älteren unter euch werden noch wissen: Es gab in der Regel drei verschiedene Modi:
- „Abc“: Das nächste getippte Zeichen ist groß, alle folgenden automatisch klein
- „ABC“: Alle folgenden Zeichen werden groß
- „abc“: Alle folgenden Zeichen werden klein
Bei manchen Geräten hatte man noch einen Sondermodus für Ziffern, manchmal sogar einen für Sonderzeichen.
Es zeigte sich, dass der Wechsel zwischen diesen Schreibmodi keineswegs simpel zu verstehen war. Im ersten Anflug nahmen wir schlicht an, die drei Modi würden einfach zyklisch durchgeschalten. Doch die Probleme fingen schon damit an, dass die Wechseltaste mal ein [*] und mal ein [#]. Und tatsächlich war die Reihenfolge nicht eindeutig zu bestimmen. Denn plötzlich stellte sich raus, dass es Spezialfälle gab. So wird bspw. an einem Satzende automatisch zu „Abc“ gesprungen.
Ich wollte es nun ganz genau wissen und plünderte unser Spendenkonto (an dieser Stelle wie immer der herzlichste Dank für jeden von euch, der etwas betragen konnte! Wer noch möchte: https://blog.gcwizard.net/de/unterstutzen-und-beitragen/). Ich besorgte ein paar Geräte zum durchtesten:
Ich fühlte mich gleich wieder in die Vergangenheit versetzt:
Hast du ein Nokia-Ladekabel? – Nee, nur Motorola oder Siemens.
Zur Sicherheit, falls eines der Geräte nicht mehr funktionieren sollte, hatte ich von jedem Hersteller mehrere Modelle besorgt, sofern möglich. Es sollte sich als Segen und Fluch zugleich herausstellen.
Als erstes betrachtete ich die beiden Samsung-Geräte (weil ich die ohne SIM-Karte starten konnte; einige SIM-Karten hatte ich dann freundlicherweise von anderen Usern nach und nach gestellt bekommen). Es handelt sich hierbei um das E1120 und das GT-E1170. Bisher war ich der naiven Ansicht, dass wenigstens die Geräte des gleichen Herstellers wohl gleich funktionieren müssten. Aber der erste Blick auf die beiden Samsungs offenbarte: Das Leerzeichen ist bei dem einen Gerät auf der [0] und bei dem anderen auf der [#]. Aber wenn das Leerzeichen auf der [#] ist, wie wechselt man denn da die Schreibmodi durch? Genau, auf dem [*], während das andere Gerät das nicht durch das Leerzeichen belegte [#] verwendet.
Ihr ahnt es sicher: Es stellte sich heraus, dass sich wirklich JEDES – EINZELNE – GERÄT unterschiedlich verhielt.
Der ursprüngliche Plan, einfach nur mal unsere Vanity-Funktion korrekt mit Sonderzeichen zu versehen, schmolz dahin. Hier war klar: Man brauchte für jedes Gerät einen komplett eigenen Simulator.
Ich verbrachte nun Stunden um Stunden damit, zu ergründen, wie sich das jeweilige Handy verhielt. Es gibt Modelle, die wechseln zwischen „Abc“ und „abc“ hin und her, ohne aber „ABC“ zu benutzen. Es gibt welche, die gehen nach einem Satzzeichen (?!.) und einem darauf folgenden Leerzeichen direkt zu „Abc“, außer wenn man vorher im Modus „ABC“ war. Es gibt welche, wo in den Modus „123“ mit einer anderen Taste gewechselt wird, als in den Großschreibmodus. Es gibt sogar Geräte, da kann man in den nächsten Modus nur gelangen, wenn man eine Taste lang drückt (was sich natürlich schlecht im späteren Tool kodieren lässt, weswegen das nicht unterstützt wird). Wirklich jedes Gerät hat seine ganz eigenen Macken und die galt es zu finden.
Hier seht ihr die grafische Darstellung der Modus-Wechsel („?“ bezeichnet ein Satzzeichen, also „.?!“, der Unterstrich stellt Leerzeichen oder Zeilenwechsel dar, das „*“ oder „#“ – oder eben in einem Fall die „0“ – stellen die Modus-Wechsel-Tasten dar und „x“ jedes sonstige schreibbare Zeichen):
Manche von ihnen sind echt abgefahren. So kommt man bei einem Siemens A65 nur dann in den Modus „ABC“, wenn man vorher vom Modus „Abc“ aus einen Buchstaben getippt hat, wobei nach dem Tippen erstmal in den „abc“-Modus gewechselt wird. Oder beim Siemens S55 kommt man nach einer Satzzeichen-Leerzeichen-Kombination nur dann zu „Abc“, wenn man diese Kombination nicht direkt am Textbeginn schreibt.
Das alles einzeln zu programmieren war definitiv nicht mein Plan und so verabschiedete ich mich an dieser Stelle komplett von unserem alten Code. Bisher hatte ich noch geglaubt, dass, wenn man hier und da einfach eine Ausnahme reinschreibt, man schon irgendwie ans Ziel kommen würde. Doch jedes einzelne Gerät ist seine ganz eigene Ausnahme. Ich entschied mich dann dazu, etwas zu programmieren, was wir in der Informatik eine „State Machine“ nennen. Im Wesentlichen definiert man Zustände, so genannte „States“. Und man definiert, wie man zu diesen Zuständen kommt und mit welchen Eingaben man diese zu welchen Zuständen wieder verlässt. Das grafische Ergebnis habt ihr gerade sehen können. Die Kästchen stellen die Zustände dar, die Pfeile zeigen, wie man diese erreicht bzw. verlässt. An den Pfeilen stehen die jeweiligen Eingabezeichen, die für den jeweiligen Zustandswechsel notwendig sind. Jetzt muss ich zwar für jedes Gerät diese Zustände, so genannte Zustandsgraphen, beschreiben, aber ich brauche nur noch exakt einen einzigen universalen Code, um das ganze zum Laufen zu bringen – nämliche die „universelle Zustandsmaschine“. Diese nimmt einfach ein Set von Regeln entgegen und läuft dann die jeweiligen Eingaben ab; ziemlich genau wie der Mensch das auch tut, wenn er eines von den Diagrammen liest.
Nun, irgendwann hatte ich das Gefühl, dass ich alles erkundet hatte. Bis ich aus Versehen bei einem Gerät die Option „Eingabesprache“ entdeckte. Ich dachte mir nichts dabei. Wird wohl nur das Wörterbuch für die Wortvorschläge sein, dachte ich. Bis ich bemerkte, dass ich in der neu gewählten Sprache kein „Ä“ mehr eintippen konnte…
Das Eingabeverhalten ist also nicht nur abhängig von Hersteller, nein, noch nicht mal vom speziellen Modell, sondern auch noch von der gewählten Eingabesprache!
Im Nachhinein ist das völlig klar: Die Türken brauchen natürlich andere Sonderbuchstaben als die Deutschen, die Englisch-Schreiber fast gar keine. So unterscheiden sich die Tastaturbelegungen bei einem Motorola RAZR V3 für eine [2] wie folgt:
Deutsch: a b c 2 ä
Englisch: a b c 2
Bulgarisch: а б в г 2
Serbisch: a b c 2 а б в г
Kroatisch: a b c 2 č ć
Rumänisch: a b c 2 ă â
Slowenisch: a b c 2 č
Die Eingabe von „22222“ ergibt bei diesem Gerät also je nach Sprache wahlweise „ä“, „a“ (Wenn man mehr Zeichen eintippt als die Tasten hergeben, wird wieder am Anfang begonnen), „2“, „а“ (kyrillisch), „č“ oder „ă“. Unnötig zu erwähnen, dass die Sprachauswahl bei jedem Gerät wieder anders ist. Die hier genannten osteuropäischen Sprachen gibt es beispielsweise bei keinem anderen Gerät.
Doch, um noch einen drauf zu setzen, habe ich bei den Siemens-Geräten entdeckt, dass es, wenn man „Griechisch“ auswählt, keinen „abc“-Modus mehr gibt. Das bedeutet: Die oben entwickelten Zustandsgraphen sind nicht allgemeingültig, sondern im Zweifel sogar sprachspezifisch! Zur meinem Glück entpuppte sich dieses Siemens-Griechisch als einzige Ausnahme in dieser Hinsicht. Aber der Vollständigkeit halber hier der, zum Glück sehr einfache, Griechisch-Graph für das A65, C75, ME45 und S55 (das S35 hatte keinen Griechisch-Modus):
Nun ja, am Ende war das große Ziel natürlich, das alles in den GC Wizard einzubauen, was heute, nach wochenlanger akribischer Arbeit tatsächlich geschafft wurde:
Mir ist natürlich klar, dass diese Funktion quasi nie benutzt werden wird. Und gerade deswegen ist der Kosten-Nutzen-Aufwand zu Recht infrage zu stellen. Aber hier griff mein persönlicher Anspruch auf Perfektionismus, hier griff der Forscherdrang, hier konnte ich mich mal wieder toll austoben, während der Rest des Teams gerade an der supertollen Bilder-Sektion arbeitet (seid gespannt, das wird episch!).
Und ja, bitte keinen Herzinfarkt bekommen, es wird weiterhin einen „Simple Mode“ geben, um euren Multitap Code wie bisher zu handhaben 🙂
Zum Abschluss noch ein Wort zu den Grenzen bzw. Grenzüberschreitungen des hier beschriebenen Systems:
- Es gibt es keinen LongPress (Langes Gedrückthalten einer Taste). Der klassische Telefontasten-Code besteht nur aus Ziffernblöcken wie „111 22222“ (plus eventuell ergänzender „#“- oder „*“-Zeichen). Einen LongPress kann unser System nicht darstellen, weil der Telefontasten-Code das nicht definiert. Manche Geräte haben jedoch Sonderfunktionen, wie das direkte Schreiben der jeweiligen Ziffer, oder eben auch das Umschalten der Schreibmodi auf dem LongPress. Diese Funktion fehlt dann hier natürlich.
- Das Motorola CD930 hat in unserem System keinen Kleinschreibmodus. Um in diesen zu gelangen, benötigt man auf dem Gerät ebenjenen LongPress. Da der aber, wie beschrieben, nicht unterstützt wird, gibt es in unserem Simulator für dieses Modell auch keine Kleinschreibung.
- Das Sagem My X-3 kann mit unserem System kein „B“ oder „C“ oder „E“ oder „F“ oder … tippen. Das Problem ist, dass bei diesem Gerät kein „Multitap“ implementiert wurde. Mehrere Male [2] tippen, schreibt mehrere Male „A“. Der Buchstabenwechsel findet dort mittels LongPress statt, sprich: Taste halten bis der gewünschte Buchstabe kommt. Und da der LongPress im Code und Simulator fehlt, kann man nur die jeweils ersten Buchstaben der jeweiligen Tasten tippen.
- Thema T9: Viele werden sich erinnern: Beim Durchschalten der Modi landet man bei manchen Herstellern zwischendurch auch in einem T9-Modus (bspw. „Abc“ -> „T9“ -> „abc“ -> „Abc“). Da wir kein T9 unterstützen, wurde das im Gesamtsystem komplett unbeachtet gelassen. Das heißt auch, dass ein Wechsel von „Abc“ zu „T9“ ignoriert wird. So wird statt der 2 Moduswechsel (bspw. „##“), die in unserem Beispiel real notwendig wären, um von „Abc“ zu „abc“ zu gelangen, nur ein Moduswechsel benötigt („#“). Wenn wir das noch realistischer gemacht hätten und T9 beachtet hätten, wären wir noch monatelang beschäftigt gewesen. Allein authentische, gerätespezifische T9-Wörterbücher zu bekommen erweist sich dabei als nahezu unknackbare Hürde.
- Bei manchen Geräten öffnet [*] oder [#] eine Art Untermenü für Sonderzeichen. Dort kann man dann mit den Pfeiltasten das jeweilige Zeichen ansteuern und aussuchen. Da wir nicht auch noch Pfeilaktionen einbauen wollten, wurde diese Liste der Sonderzeichen einfach so behandelt wie eine normale Tastaturbelegung. Man braucht also „*******“ um das siebente Sonderzeichen dieses Menüs zu schreiben.
Ich hoffe, ihr fandet es mal spannend, einen tieferen Einblick in unsere Arbeit zu bekommen; zu sehen, was es bedeuten kann, „nur mal schnell“ eine neue Funktion zu entwickeln. Ich hatte jedenfalls sehr viel Spaß damit – bin aber auch froh, dass ich das Kapitel nun schließen darf 🙂
Meinen grössten Respekt an dieser Stelle für die ganze Arbeit! Ich ziehe meinen Hut vor soviel Verbissenheit! ?