2025 - Unicode für Anfänger Free and Open Source Software Conference (FrOSCon) e.V. https://www.youtube.com/watch?v=ZSKT7Fz8B60 Transkript (automatisch erstellt) 0:06 Hallo, vielen Dank. Schön, dass ihr es so zahlreich geschafft hat. Ich habe irgendwie den Slot hier draußen riecht man schon das Angrillen. Nebenanläuft 0:14 State of the Union. Deswegen ist das hier mal State of the Unicode. Ähm eigentlich angekündigt als Unicode für Anfänger, aber ähm die Folie habe ich 0:24 dann eben noch kurz eingebaut. So eine Stunde Vortrag führt für den es fühlt sich für die Zuschauer immer ein bisschen seltsam an. Das habe ich heute 0:32 ein paar mal erlebt, dass die Talks dann doch so 10 Minuten länger haben und ich dachte mir, das ist so ein kleines Thema, da bin ich in 20 Minuten fertig 0:39 und dann sind es doch Stoff für eine Stunde, die hoffentlich gefüllt ist. Ich hoffe, ich b ich hoffe, ich langweile euch nicht. Schön, dass ihr da seid. 0:48 Ähm, ich erzähle euch heute ein bisschen was über Zeichencodierungen, wie man das früher gemacht hat. Dann erzähle ich euch, wie dann erzähle ich euch, wie wie 0:56 man das heute macht und ähm dann erzähle ich euch, wie man es transportiert und dann haben wir ein bisschen Spaß miteinander, wie man sortiert, 1:05 vergleicht, normalisiert. Ähm und zum Schluss, wenn dann noch Zeit ist, erzähle ich euch, wie es zu diesem Vortrag gekommen ist. Ähm, früher hat 1:12 man immer gesagt, wenn du dir bei irgendeinem Thema nicht hundertprozentig sicher bist, schreibst im Internet, irgendeiner wird dich korrigieren. Ähm, 1:19 heute halte ich einen Vortrag und hoffe, dass mich irgendeiner korrigiert, wenn ich Unsinn erzähle. Ähm, ich bin Mark Haber, Diplominformatiker. Das Netz 1:27 kennt mich als Zschluss mit nur einem S. Ich wohne in St. Ilgen bei Heidelberg. Ich bin ein bisschen älter, verheiratet, vier Katzen. Ich arbeite als freier 1:37 IT-Berater. Ähm, mit Linux und Netzwerken bleib mir weg mit Microsoft und Apple. Ähm, ich bin Debian Developer seit 2001 1:47 und ich würde auch gerne mal wieder mit Debien arbeiten. Ich habe Kapazitäten frei. Also, wenn irgendjemand ähm denkt, ich könnte bei Ihnen was helfen, dann 1:54 mache ich das gerne. Computer verarbeiten Zahlen, Menschen verarbeiten Buchstaben. Das muss man irgendwie miteinander verheiraten, 2:03 ansonsten wird das langweilig. Deswegen müssen wir Dinge codieren. Und damit hat man schon 1901 angefangen. Da gab es diesen Bordo Mö Code, der für den Telex 2:13 benutzt wurde. Das war das damals übliche Speichermedium. Ähm und das Ding hat, wie man sieht, 2:23 eine Spur für den Takt und 5 Bit. 5 Bits sind 32 mögliche Codierungsmöglichkeiten. Wir haben 26 Buchstaben und 10 Zahlen. 2:37 Schon das passt nicht. Deswegen hat man damals einen Trick gemacht. Es gibt im Bodocode zwei verschiedene Leerzeichen, die nicht nur einen Leerschritt 2:45 auslösen, sondern auch eine Umschaltung vornehmen. Das war wirklich damals eine Umschaltung. hat sich also im Telex Gerät die ähm der Korb mit den Typen um 2:55 ein Stück nach oben verschoben. Daraufhin hat dann der untere hat hat dann die untere Hälfte von den von den Typenhebeln ans Farband gehauen und ähm 3:04 so konnte man dann zweichen abdrucken plus die beiden inklusive der beiden Leerzeichen, also eigentlich nur 62 Zeichen. Das hat zumindest für 3:15 Kleinbuchstaben und Ziffern und ein paar Sonderzeichen gereicht. Spulen wir mal 60 Jahre vor. Wir haben uns inzwischen zweimal weltweit die welt 3:26 weltweit die Köpfe eingeschlagen und dann kam 1963 der American Standard Code for Information Interchange. Das ist das, was wir noch als ASKI kennen. Ähm, 3:37 das Ding hat 7 Bit pro Zeichen, sind 128 Zeichen. Da haben wir Platz für Großbuchstaben, Kleinbuchstaben, Ziffern und ein paar Sonderzeichen und ein paar 3:44 Steuerzeichen, aber immer noch keinen Platz für internationale Umlaute. Deswegen heißt das American Standard Code for Information Interchange. Die 3:52 haben das einfach nicht. M im ASKIC Code waren dafür geschweifte Klammern in senkrechterstrich in Backslash eckige Klammern drin. Die haben die anderen 4:02 Länder dann durch ihre Sonderzeichen ähm durch durch ihre Sonderzeichen ersetzt relativ schnell, also auch noch 1963. Das Ganze wurde dann international 4:12 standardisiert als ISO 646 und dieser Ersatz von den Umlauten durch Klammern sehen wir heute noch. Ich habe das glaube ich letzte Woche mal gesehen in 4:22 dem Laden, wo in dem Kundendisplay ein Artikelname angezeigt wurde, der eigentlich ein Umlut hätte enthalten müssen. 4:31 Stattdessen stand da eine geschweifte Klammer auf. Ähm, wir haben 2025, wir haben das immer noch. Ähm, man hat dann 1987 angefangen 4:42 das achte Bit zu benutzen in einem Bite. Plötzlich hatte man 256 Möglichkeiten. Es hat aber immer noch nicht gereicht. Deswegen hat der ISO Standard 8859 4:53 verschiedene Unterstandards. Wir kennen den ISO 88591 für die westeuropäischen Sprachen, wo halt die gängigen Umlaute drin sind. Es gibt den 885915, da kam 5:02 dann 1999 das Eurozeichen dazu. Ähm, andere Sprachfamilien haben andere ISO 8859 Standards. Die 15 kommt nicht, die hat man nicht gewürfelt, sondern da sind 5:14 14 andere davor. Ähm und es gibt auch eine, wo so eine Strichgrafik, wo so einfache Strichgrafikzeichen drin sind. Ähm, wenn das nicht richtig ausgewählt 5:23 wurde, es hat man immer dran gesehen, dass so Tools wie Tri oder PS3 eben keine Linien gemalt haben, sondern Umlaute. 5:33 Ähm, dann muss ich noch ähm ein paar Exoten erwähnen, nämlich zum einen ähm zum 5:41 einen Epsidic IBMs Rache. Ähm, das findet man eigentlich nur noch in Großrechnern, ähm also außerhalb von Banken und Versicherungen nicht mehr. 5:51 Ähm, wenn man sich das Ding anguckt in so einer Tabelle, versteht man auch, wie die Codierung gemacht ist, aber es ist so absurd, dass 5:59 da da kann man nicht mal anständig vergleichen drin. Aber Codierungen, in denen man nicht vergleichen kann, die kriegen wir heute noch genug. Dann gab's 6:06 noch dieses Windows 1252 und die Code Pages 850 und 437, die in Windows, glaube ich, bis heute noch benutzt werden. Ähm und dann gibt es für 6:17 jenseits des eisernen Vorhangs, die konnten natürlich keinen amerikanischen Standard benutzen, damals gab es KI8 für kürillisch geschriebene Sprachen. Gibt's 6:25 heute noch, aber wir benutzen es glücklicherweise nicht mehr überall. 1991 kam dann Unicode. Ähm, das wurde von einer Nonprofice Organization in in 6:36 den USA entworfen, dem dem Unicode Konsortium. Die haben das Heere Ziel Text in allen digitalisierbaren Schriften zu unterstützen. 6:45 Ähm, inzwischen ist das bei Version 16 von 2024, das wird also immer mal wieder fortgeschrieben. Wir haben knapp über 150.000 Zeichen und 168 verschiedene 6:57 Schriften, die in Unicode abgebildet werden können. Ein Skript will ich jetzt mal als eine Schrift bezeichnen. Eigentlich ist es eine 7:08 Sammlung von Buchstaben und anderen Zeichen zur Repräsentation von Texten in einem oder mehreren Schreibsystemen. ähm 7:17 Beispiel die lateinische Schrift, die wir sie hier benutzen, aber auch arabische und asiatische Sprachen, die nicht in Buchstaben, sondern in Silben 7:24 oder in ganzen Wörten denken. Ähm, es gibt Formelzeichen, Emoticons, Grafikelemente. Was es noch nicht gibt, ist klingonisch. 7:34 Das ist in Arbeit, kommt vermutlich nach Unicode 17. Ähm, das Ganze wurde auch international standardisiert. Das ist die ISO 10646. 7:43 Wir erinnern uns, die 646 war der ASKI Code und jetzt sind wir bei 10646. Ähm, das ist natürlich nicht genau Unicode, sondern die Abweichungen sind da, aber 7:52 sie sind minimal. Ähm, Unicode können wir seit etwa der Jahrtausendwende ernsthaft benutzen. Es hat eine Weile gedauert. 8:02 Wir in der freien und Open Source Community haben, glaube ich, sogar damit angefangen. Ähm und inzwischen ist es so, dass diese ganzen Altcodierungen 8:11 eher so als Altlast gelten, was natürlich nicht heißt, dass die einem immer noch über den Weg laufen, wie z.B. mein Erlebnis letzte Woche im 8:17 Supermarkt. Ähm ein Unicode Zeichen hat natürlich sein Aussehen, aber es hat auch Eigenschaften. Es kann Uppercase sein, 8:26 ein Großbuchstabe, es kann Lower Case sein, ein Kleinbuchstabe, wenn das verwendete Skript davon überhaupt eine Idee hat. Es gibt ja Sprachen, in denen 8:33 gibt's das gar nicht. Es kann eine Zahl sein, es kann ein Steuerzeichen sein, es kann ein Sonderzeichen sein und es gibt auch Operationen. Ich kann z.B. einen 8:43 kleinen Buchstaben in einen Großbuchstaben umwandeln oder andersrum. Ich kann vergleichen A kleiner B, ich kann sortieren. 8:53 Mark kommt vor Reiner. Ähm, aber ich kann die Dinge auch verwechseln. Es gibt die sogesannten 9:01 Confusibles, die haben sogar ihren Weg in einen RFC gefunden. Es gibt die 1, das kleine L, das große I. Das muss man voneinander unterscheiden können. Es 9:10 gibt die Null, es gibt das große O. Das muss man auch voneinander unterscheiden können und das ist sicherheitsrelevant, weil es gibt schon, weil es gibt ja 9:18 durchaus ähm E-Mails, die einen auf microsoft.com locken sollen und wenn man genauer hinguckt, ist das nicht Microsoft, sondern Micrull Soft. 9:30 Ähm und dann gibt es die gesamten die sogenannten Homoglyphen. Sind die Zeichen, die gleich aussehen, aber eine 9:36 unterschiedliche Bedeutung haben. Das A gibt es im Lateinischen, im kyrillischen. Im Griechischen gibt es ein Alpha, das groß geschrieben 9:44 praktischerweise genauso aussieht wie wie unser lateinisches A. Römische Zahlen sehen aus wie MCI 9:55 X. Und ähm dann gibt es noch so nette Dinge wie das nordische O, das auf der einen Seite ein Buchstabe ist und auf der 10:04 anderen Seite die Einheit, eine Längeneinheit und zwar eine ziemlich kurze. Es gibt Zeichen, die zusammengesetzt 10:12 sind. Damit hat man aber erst relativ spät angefangen, obwohl die Schreibmaschine das ganz genauso macht. Das E mit 10:19 Aconenton gibt es in Unicode als einen eigenen Codeepoint, aber man kann es auch aus dem E und aus dem Acon kombinieren. Und damit es noch nicht 10:28 richtig gemein genug ist, ist die Reihenfolge egal. In oste in in manchen osteuropäischen Sprachen ist es noch viel schlimmer. Da 10:37 gibt es z.B. das Touch, das ungarische Feuer, das hat zwei Akzente auf dem U. Das kann man in Unicode als U mit einem Akzent und noch einem Akzent darstellen. 10:49 Ähm, es gibt Modifikationen, die wirksam sind, die also wirklich den Buchstaben anders machen und es gibt welche, die nicht wirksam sind. Und das ist auch 10:58 noch netterweise auch noch in jeder Sprache anders. Es gibt also Buchstaben, die unterschiedlich aussehen, die gleiche Bedeutung haben und in der 11:04 anderen Sprache unterschiedlich aussehen und nicht die gleiche Bedeutung haben. Es gibt Whitespace in verschiedenen Breiten bis hin zu einem Whitespace mit 11:12 Breite Null und es gibt Richtungswechsel, weil es gibt ja auch Sprachen, die von die die von rechts nach links geschrieben werden. Das muss 11:22 man alles berücksichtigen. Dann gibt es unterschiedliche Ansichten über Zeichen. Es gibt Schriften, die Buchstaben haben. Es gibt Schriften, die 11:31 ganze Silben beschreiben und es gibt Schriften, die ganze Worte beschreiben pro Zeichen. Ähm, unvollständige Fonds sind alltäglich, weil wir haben über 11:43 150.000 Zeichen. Welcher Fond enthält alle 150.000 Zeichen? Ähm, gerade so, wenn man ein bisschen grafisch anspruchsvoller unterwegs ist und so 11:51 hübsche Fonts benutzen möchte, dann findet man teilweise Fonds, in denen nicht mal Umlauter enthalten sind. Ähm, 11:59 aber das was man so von Microsoft und Google aus dem Webterladen kann für seine Webseiten ist eigentlich relativ gut. Aber 12:07 natürlich sind auch da nicht alle 150.000 Zeichen drin, die wir die wir im Unicode definiert haben. So, wie wird das geschrieben? 12:16 Ähm, ein Zeichen, das nennt sich Codepoint in Unicode, wird als U+ und eine Hexziffer geschrieben. Und wir codieren in 12:28 wir codieren aktuell von U + 4 x 0 bis U + 10 FFF. Wer da ein bisschen genauer hinguckt, kann sehen, dass Unicode ursprünglich 12:38 mit vier Ziffern spezifiziert war, also mit 16 Bit. Das hat nicht gereicht. Also hat man es einfach hat man es einfach vergrößert. Ähm 12:48 inzwischen sind wir bei etwas über 1 000 Code Points in Unicode. Stimmt das? Ja, das muss stimmen. Ähm oder mir ist eine eins zu viel 13:03 reingerutscht. Ähm und da wir nicht immer die Codepoints ausschreiben wollen, gibt es eine Art der Codierung. Das nennt sich 13:13 Transportcodierung. Ähm und ich habe damals in der Uni gelernt, dass man ähm einen Transport sowohl von A nach B über das Netz 13:21 definieren kann, als auch den Transport über die Zeit. Weil wenn ich etwas in wenn ich etwas in eine Datei reinschreibe und das in zwei Tagen 13:29 wieder auslese, kommuniziere ich mit mir selbst. Das ist auch ein Transport. Deswegen ist der Begriff Transportcodierung an der Stelle 13:35 richtig. Das ist das Unicode Transformation Format UTF. Davon gibt es ein paar Varianten. Die wichtigsten möchte ich euch jetzt vorstellen. Die 13:44 allerwichtigste ist natürlich UTF8. Das ist das, was wir benutzen. Das ist dominant für alle Sprachen und Länder. Alle Sprachen, alle Standards benutzen 13:54 es. Es ist oft die einzige Codierung, die man benutzen darf. Es wird eigentlich von allen modernen Systemen unterstützt. 14:03 Ähm, es gibt einen Standard dazu, den RFC 3629. Der ist also auch schon einige Zeit alt. Ähm, und was an UTF8 ganz besonders sexy ist, es ist rückwärts 14:14 kompatibel zu 7 Bit ASKI. Die ersten 128 Zeichen sind identisch. Sie werden in UTF8 codiert mit einem einzigen Bitprzeichen 14:25 und das ist die gleiche binäre Repräsentation. Das heißt, wenn ich einen Text habe, der nur amerikanische Zeichen enthält, dann ist der in UTF8 14:33 identisch zu dem Text in ASKI und das ist unser Glück. Ansonsten hätten wir noch viel mehr Spaß. Was äh nicht in den 7 Bit 14:42 ASKI Code reinpasst, wird länger codiert. Da brauchen wir dann zwei, drei oder vier Bitte pro Zeichen. Je höher die Codebund die Codepunktnummer, 14:52 desto länger ist die Codierung. Und hier sieht man auch gleich den ersten Spaß, weil die, weil das ISO 8859 mit dem ersten gesetzten Bit, das ist 15:03 nicht identisch mit Unicode. Und wir werden heute noch ein paar Fehler sehen, wo genau das passiert, wo man einen 8 Bit ASKI oder ISO 8859 als Unicode sich 15:12 anguckt. Aber ich erzähle euch erstmal, wie UTF8 funktioniert. Die ja, den Zeiger sieht man sehr schön. Ähm 15:22 und die ersten 7 Bit, also Codepoint 0 bis 7F sind identisch. Da hat man eine Null vorne dran im in dem einzigen Bitte, dann die 3 Bit, die von dem 15:32 ersten Nibel übrig bleiben und die vier Bit, die vom zweiten Nibel übrig bleiben. Von 80 bis 7 FF sieht das ganz ähnlich aus. Hier hat man aber das 15:46 erste die erste Hexziffer, die zweite Hexziffer ist schon verteilt auf die zwei Bites und die dritte Hexziffer ist 15:53 zum Schluss. Das geht dann weiter für die Codepoints von 800 bis FFF, die in 3 Bytes codiert werden und die ganz oben liegenden werden in 4 Bytes codiert. Ähm 16:05 hier unten ist noch ein Beispiel, wie z.B. das W codiert wird. Ein Zeichen, das aussieht wie ein B. Aber kein B ist, sonst wäre es ja weiter 16:16 vorne. Ähm, ein japanisches Zeichen und was ist das vierte? Ein sehr weit oben liegender Codepoint, wo dann wirklich vier UTF8 codierte 16:27 Bites rauskommen. UTF8 ist für westliche Sprachen Speicherplatze effizient, weil die meisten unserer Zeichen, die 16:37 wir benutzen, in einem Bitte dargestellt werden können. Nur was nicht in den ASKCode reinpasst, braucht mehr als ein Bitte. Die Sonderzeichen, die wir 16:45 verwenden in unseren westlichen Sprachen, die kommen eigentlich alle mit zweibit aus. Ähm und gebissen sind natürlich mal wieder 16:53 die arabischen und asiatischen Sprachen, die mit drei oder die mit drei und vier bitcodierten Zeichen arbeiten müssen. Das ist aber immer noch besser als für 17:03 jedes Zeichen vier Zeich beit zu verbraten. UTF8 ist Längenvariabel. Das heißt, wenn ich das, wenn ich ein bestimmtes Zeichen 17:12 aus einem String rausziehen möchte, dann muss ich trotzdem vom Anfang an den String den den String lesen. Ich kann also nichts rechnen, wenn ich sage, ich 17:22 möchte jetzt das fünfte Zeichen von diesem String. Es könnte ja ein Zeichen vorne dran sein, das länger codiert ist und ich weiß auch nicht, wie ich muss 17:28 also immer von vorne anfangen. Ähm und dazu kommen wir später noch. Das Bite Order Mark in einem UTF8 Text ist optional. 17:38 Und damit wir richtig Spaß dabei haben, nicht alle Bitsequenzen sind valides UTF8. Ähm und dieses Verhalten hier kommt 17:48 allerdings auch vor, wenn der Fond in den das in den der Text dargestellt wird unvollständig ist. 17:59 Der nächste Spaß, der uns mit UTF8 auf auftreten kann, ist das sogenannte Moji Bake. Das kommt eigentlich aus dem Japanischen. Das kann man aber auch mit 18:07 einer Das kann man aber auch mit einem westeuropäischen Text ähm haben. Wer von euch liest das flüssig und weiß genau, was das eigentlich hätte 18:18 heißen sollen? Da hätte ich jetzt eigentlich mehr als zwei Hände. Gut, da kommen jetzt ein paar mehr. 18:25 Das kennen wir schon. Dieses Problem entsteht, wenn ich einen UTF8 codierten Text noch mal durch den UTF8 Encoder durchschiebe. 18:37 Eine Anwendung, die Unicode und insbesondere UTF8 Texte verarbeitet, muss ich immer im klaren sein, wie ein String, den ich gerade 18:47 handhabe, codiert ist. Ähm eigentlich ist man gut beraten, alles was reinkommt direkt mal nach UTF8 oder nach einem anderen UTF Format zu konvertieren und 18:57 dann muss man sich innerhalb seines kurz keinen Gedanken mehr machen, wie der drin gerade codiert ist. Wenn man das nicht weiß und man sicherheitshalber 19:04 noch mal codiert, dann kommt das raus, was wir eben gesehen haben. Ähm, weil sich bereits UTF8 Codes Drinks noch einmal UTF8 codieren lassen. Das Üttin 1 19:17 hat den hat die Darstellung Hex FC. In UTF8 wäre das C3BC. Das ist das A mit der mit der Tilde oben drüber und das ein und die ein Ligatur. 19:34 Wenn ich das als UTF8 decodiere, das C3BC, dann kriege ich wieder das Ü raus. Wenn ich es noch mal UTF8 codiere, nehme ich 19:42 das C3, was das A mit der Tilde ist, erzeuge daraus Unicode C383 und dann nehme ich mir die ein Ligatur BC inletin 1 umcodiert den Unicode ist 19:55 C2 BC. Da kommt dann da kommt dann in Mojibake eben diese 4B Codierung raus und am Ende sieht das so aus, wie es unten dargestellt wird. Manche Leute 20:06 nennen das Double UTF8, was man dann im Deutschen als WTF8 bezeichnen könnte, aber den Witz kann man eigentlich nicht 20:15 machen, weil WTF8 gibt es. Ähm, man kann durch diese Umformungsregeln, 20:25 die ich euch eben gezeigt habe, einen UTF8 Text Standardkonform codieren, der aber länger ist als die eigentliche Standardcodierung. 20:35 Ähm, dummerweise können die meisten Libraries mit diesen Encodings umgehen, aber auf diese Weise kann man die kann man die Software angreifen. Man kann 20:46 also einen String generieren, der genauso aussieht und der sich auch auf die gleichen Zeichen dekodieren lässt, der aber bei naivem Vergleich ungleich 20:56 ist und das möchte man eigentlich nicht. Also eigentlich möchte man in einer Software, wenn man einen String aus einer nicht vertrauenswürdigen Quelle 21:02 einliest, gucken, ob das UTF8 nicht nur von der verwendeten Library ordentlich decodiert werden kann, ob er das auch keine Overlong Encodings drin sind, weil 21:11 ansonsten kommt, weil ansonsten passiert das da. Dann wird mal gekratzt. Die zweithäufigste 21:21 Codierung, die man sieht, ist UTF 32. Die nennt sich auch UCS4. Die hat vier Bitte pro Zeichen und zwar immer. Das ist die einzige UTF Codierung mit fixer 21:33 Länge pro Zeichen. Es hat den Vorteil, wenn ich den wenn ich das fünfte Zeichen haben möchte, rechne ich 4 x 5, bekomme 20 raus, greift beim Index 20 in meinen 21:42 Ray rein und habe das fünfte Zeichen. Ähm, die Repräsentation ist die ist identisch mit der Codeepointummer. Das heißt, ich muss da auch nichts 21:52 umrechnen. Das ist nicht Speicherplatzeffizient und damit es zu wenig ähm und damit wir auch damit Spaß haben, gibt es das als Big Indian und 22:03 Little Indian. Und die Kennzeichnung mit Bitte Ordermk ist möglich, aber optional und wird deswegen selten verwendet. Auch hier muss man sich wissen, was man 22:12 da speichert, übers Netz schickt. Und es kann durchaus sein, dass wenn man das, wenn ein Big Indian und ein Little Indian System über das Netz miteinander 22:22 reden, dass die beide von UTF32 die unterschiedliche Meinung haben und und dann kommt am Ende nur Salat raus. Ähm UCF 22:31 im UTF 32 wird dort verwendet, wo es schnell sein muss und wenn man genug Speicher hat. Ähm neueres Python z.B. benutzt UTF32, sobald es in einem String 22:41 den ersten nicht 7 Bit 18 ähm den ersten nicht 7 Bit ASKY Character sieht. Das kriegt man aber nicht mit. Das muss man sich nicht mitschreiben. 22:51 Das macht der Python, das macht der Python Interpreter für euch. Ähm das finde ich sehr praktisch. Ähm, ich muss jetzt noch erwähnen, dass 22:59 es auch UTF16 gibt. Ähm, das war eine Codierung mit fester Länge bis zu dem Punkt, wo der erste Codepoint vergeben wurde, der eben nicht mehr in 16 Bit 23:08 reingepasst hat. Heute vereinigt das nur noch die Nachteile von UTF8 mit den Nachteilen von UTF32. Wir haben eine variable Länge. Wir sind nicht 23:16 Speicherplatzeffizient. Ähm, es hätte eigentlich das hätte eigentlich deated gehört, als man angefangen hat Zeichen jenseits der 16 23:26 Bitgrenze zu vergeben. Das wird dementsprechend selten benutzt. Man sollte es bitte nicht neu verwenden. Und Martin, 23:37 das ist auf der nächsten Folie. Das ist selten benutzt. Man sollte es bitte nicht neu verwenden, aber natürlich wird es doch benutzt. Ähm 23:45 Windows kennt das Konzept eines White Characters, das wird z.B. in Filnamen benutzt, JavaScript benutzt ist. Ähm und damit es nicht so ganz schwierig ist, 23:55 hat man dann um die Jahrtausendwende rum das Format WTF8 definiert. Ähm wo aber schon im Standard steht, dass das bitte nur intern zu verwenden ist. Und damit 24:04 und um klar zu machen, dass das wirklich so gemeint ist, das ist der Satz aus dem Standard must not be used. So klar ist ein Standard selten 24:16 in JavaScript z.B. in meistens so internen Repräsentationen. Das weißt du vermutlich mehr als ich, weil du mehr, 24:23 weil du mehr Entwickler bist als ich. Ich habe es in der Praxis noch nicht gesehen. Ich bin da auch nur bei der Vorbereitung dieses Vortrages drauf 24:29 gestoßen, weil ich den Witz mit dem WTF8 machen wollte und musste dann feststellen, schade, ich kann ihn nicht machen, weil es gibt's schon. 24:37 Ähm, ich habe eben schon das Bite Order Mark erkannt. Ähm, das funktioniert so, dass man seinen Unicode Dring mit einem nullbreiten 24:47 nichtbrechenden Leerzeichen beginnt. Das ist der Codepoint FEF. Und die ganzen UTF Codierungen, auch die, die ich jetzt 24:58 nicht erwähnt habe, sind so gebaut, dass man aus der Art, wie dieses FEFF codiert wird, ablesen kann, wie welche Codierung zur verwenden 25:08 verwendet ist und welche Variante davon, also insbesondere welche ist im im UTF 32. Und weil das so praktisch ist, wird es deswegen selten verwendet. 25:18 Es ist außer bei Bank recht gerne für Online Banding und ich hab schon gewundert FF dran stand. 25:28 Genau. Der fast normal der Zwischenwurf war der Zwischenwurf war das wird bei Banken gerne verwendet. Es es gibt Software es gibt Software, 25:37 die es benutzt. Ähm, aber es ist leider sehr, sehr selten. Es wäre sehr praktisch, es ist optional und ich wäre dafür, dass wir versuchen, 25:47 es mehr zu verwenden. Kommen wir jetzt zum Sortieren. Ein Sortieren, eine Sortierung bringt Elemente in eine bestimmte Ordnung. 25:55 Mathematisch gesagt ist das eine Halbordnung bezüglich der binären Relation kleiner oder gleich. Das ist schon innerhalb eines Skripts, 26:04 also innerhalb einer Schrift herausfordernd. Im Deutschen ist die Konvention, das genauso sortiert wird, als wäre es ein 26:12 A. Im Schwedischen steht das O hinter dem Z, die anderen Umlaute auch. Ähm und wenn ich verschiedene Sprachen 26:22 habe und die dann miteinander sortieren muss, dann geht der Spaß richtig los. Es ist jetzt ein griechisches Alpha, größer oder kleiner als ein lateinisches A. Was 26:30 ist mit dem kyrdischen A, das praktischerweise noch in groß und klein genauso aussieht wie das lateinische A? Wie behandel ich das, wenn ich Case 26:38 insensitiv sortieren möchte, weil das griechische Alpha klein geschrieben anders aussieht als unser A, das große aber nicht. 26:45 Und was ist mit Trans mit mit Transliterationen? Eine Transliteration ist der Versuch eine Schrift zu benutzen, ohne diese 26:56 Schrift zu haben. Das hast du insbesondere, wenn so griechische Namen übersetzt sind. Da hast du in dem griechischen Personalausweis einmal die 27:01 griechisch geschriebene Variante und dann die transliterierte Variante. Das gibt es auch in den Personaldokumenten von Ländern, die kürillische Buchstaben 27:11 benutzen. Ähm zum Sortieren muss ich vergleichen. Es gibt Zeichen, die gleich aussehen, aber unterschiedliche Bedeutungen haben. 27:21 Das habe ich vorhin schon mal erwähnt, das OR und die Längeneinheit, das Angströmen. Ähm, es gibt Zeichen, die gleich 27:29 aussehen, aber aus unterschiedlichen Skripts sind, z.B. das A im Lateinischen und das A im Kyrillischen. Die Franzosen schreiben bei ihren Großbuchstaben gerne 27:37 den Axon nicht drauf, aber der Buchstabe bleibt natürlich trotzdem akzentuiert, weil wenn du das in Lowcase umwandelst, möchtest du den Axon wieder darstellen. 27:47 Und alle diese Zeichen haben in Unicode unterschiedliche Code insbesondere gibt es oft Codepoints für Einheiten. Es gibt das Ongström, es gibt das Omen, was 27:58 dann aussieht wie das griechische Omega, aber aber ein anderes Zeichen ist. Da wird also in die Zeichencodierung schon Semantik hineingelegt. Das finde ich 28:06 hochpraktisch, aber man muss drauf achten. Ähm, wenn man nach etwas sucht, möchte man den Vergleich vielleicht ein 28:14 bisschen relaxen, weil wenn ich nach Angstström suche, wenn ich in mein Suchfeld ähm Angstström eingebe, möchte ich auch den ONGström oder eine 28:24 Zahl, eine Größe in der Einheit finden. Akzent. 28:35 Ja, komme ich später noch dazu. Ja. Ja, das ähm der Zwischenwurf war ähm, dass es auch den E mit Axon als eigenes Zeichen gibt und dass man es auch noch 28:46 kombinieren kann. Da habe ich noch drei Folien zu dem Thema, glaube ich, weil das ist nicht so ganz einfach. Ähm, wenn ich Usernamen vergleiche, 28:55 kann ja sein, dass mir irgendjemand irgendwas versucht unterzuschieben. Ich habe ich kann einen Klaus Onström haben und irgendeinen Angreifer, der mir den 29:03 Klaus Onström ein zweites Mal in meine Useratenbank geschrieben hat, diesmal mit dem Engströmzeichen im Nachnamen drin. Das sieht gleich aus. Ich möchte 29:11 das ganz sicher unterschiedlich unterschiedlich behandeln. Insbesondere möchte ich dem zweiten Klaus Angström keine Rechte geben, die der eine hätte. 29:21 Ähm, man muss sich also beim Vergleich wirklich an jeder Stelle, wo man einen vergleicht, wo man zwei Strings miteinander vergleicht, darüber im klar 29:29 sein, was will ich da überhaupt gerade machen, was ist mein Ziel an dieser Stelle? Ein Vergleich ist nicht gleich ein Vergleich. 29:38 Wer hatten noch nicht genug Spaß mit Unicode? In Unicode gibt es verschiedene Positionen eines Zeichens. Man kann sie drehen. Es gibt Zeichen im Kreis, es 29:46 gibt Zeichen im Quadrat, es gibt Zeichen mit unterschiedlicher Breite. Ich habe heute schon gehört, die Verwendung eines Mdhes ist ein Zeichen dafür, dass der 29:54 Text aus KI kommt, weil das kein Mensch so tippt. Ähm, wir haben Indizes, wir haben Potenzen, wir haben Brüche, wir haben Ligaturen und ich glaube, damit 30:04 habe ich noch nicht alle Eigenschaften, die ein Unicode Zeichen, wie ich ein Unicode Zeichen modifizieren kann, ähm aufgezählt. Ähm, es gibt einen sehr 30:15 schönen Wikipedia Artikel zum Thema Unicode Equivalence. Es gibt einen Standard zu dem Thema, das ist der Unicode Andex anx Nummer 15. Der 30:24 hat überschaubare 36 Seiten, den kann man also schon mal lesen. Ähm und der definiert, wie man Zeichen darstellt, wie man Zeichen codiert, wie 30:32 Zeichen äquivalent sind. Das hier sind jetzt nur ein paar Beispiele für die kanonische Äquivalenz. Ich kann die ich kann das C mit der CD kombinieren aus 30:41 einem CD oder ich kann gleich das den Codeepoint nehmen, der das C mit der CD darstellt. Ich kann mehrere Kombinationen darstellen. Ich kann das Q 30:52 mit einem Punkt oben und einem Punkt unten drunter kombinieren. Das ist äquivalent zu dem Punkt mit einem Punkt dem Q mit einem Punkt unten 31:01 drunter und einem Punkt oben drunter oben drüber. Man beachte die unterschiedliche Reihenfolge. Ähm in asiatischen Sprachen gibt es das sehr 31:11 häufig, dass so Zeichen kombiniert werden. Die gibt es dann in Unicode auch meistens in den beiden Kombinationen jeweils als eigenen Code und in den 31:19 beiden Komponenten einzeln. Ähm und es gibt die Zeichen, die gleich aussehen, aber doch nicht gleich sind, wie z.B. das Omega und das Ohm. 31:29 Es gibt die kompatible Äquivalenz, das ist ein bisschen lockerer. Da sieht man z.B. das H in Lateinisch, in Altdeutsch, in der Doppel in der Doppel 31:40 Strichschrift, wie wir reelle Zahlen, ganze Zahlen etc. kombinieren. Es gibt verschiedene Space in verschiedenen Breiten mit mit verschiedenen 31:49 Funktionen. Es gibt Zahlen mit dem Kreis drumrum. Es gibt gedrehte Klammern für ein bisschen kompliziertere Formeln. Ich kann ein Subscript, ich kann ein 31:58 Superscript definieren. Ähm, ich kann einen Bruch als Dreizichen oder als Ligatur darstellen und ich kann ähm hm, was will der uns denn jetzt damit 32:12 sagen? Es ist other. Ähm, dieser Standard unterscheidet zwischen der kanonischen 32:20 und der kompatiblen Äquivalenz. Das hatten wir eben schon. Kanonische Äquivalenz ist gleiches Aussehen, gleiche Bedeutung. 32:26 Das möchte man beim Sortieren und Vergleichen gleich behandeln. Man kann die auch beliebig untereinander austauschen. Bei der kompatiblen 32:33 Äquivalenz kann das Zeichen anders aussehen und es hat möglicherweise die gleiche Bedeutung. Das heißt, man kann es nicht unbedingt gleich behandeln, man 32:41 kann es nicht unbedingt substituieren, aber wenn zwei Zeichen kanonisch äquivalent sind, sind sie auch kompatibel äquivalent. 32:50 Beispiel, das A mit Axon ist kanonisch äquivalent zu der Kombination aus A und dem Axon und auch unabhängig davon, in welcher Reihenfolge das steht. Das Oh 33:02 ist kanonisch äquivalent zum griechischen Omega. Das Leerzeichen ist kompatibel äquivalent zum geschützten Lehrzeichen, 33:09 an dem keine Zeilen gebrochen werden dürfen. Das R mit Doppelstrich ist kompatibel äquivalent zu einem normalen R und I² ist kompatibel äquivalent zu 33:22 dem Buchstaben I und der Ziffer 2. Der Standard definiert vier verschiedene Normalisierungsformeln äh Formen, nämlich einmal kanonisch und 33:31 einmal kompatibel und einmal die Dekomposition und einmal die Komposition. Äh dazu habe ich Beispiele. 33:39 Ähm ich habe hier das Ongströmzeichen, den Codepoint 2128. 33:49 Das ist in der einen Normalisierung das A und der das A und der Kreis. Und in der anderen Normalisierung das A mit Kreis. Man beachte hier die Codierung C5 34:00 und hier 212B. Auf der anderen Seite habe ich hier das Zeichen A mit Kreis or C5. Das ist hat die gleichen beiden Normalisierungs das 34:12 hat die gleichen beiden Normalisierungen. 4130A und C5. Genauso kann ich hier das Omega in beiden 34:24 kanonischen Normalisierungsformen das Umzeichen in beiden kanonischen Normalisierungsformeln auf das Omega abbilden. Und hier das einfache, das O 34:34 mit Circumflex kann ich kann ich darstellen auch als Kombination und als einzelnes. Ähm 34:43 und hier sind auch noch mal zwe drei weitere Beispiele, die halt die Punkte darstellen. 34:52 Wenn ich etwas kompatibel normalisiere, dann habe ich da mehr Freiheiten. Hier habe ich die Ligatur aus F und I. Die darf ich in der 35:05 dekomposiert ähm die die darf ich in der kompatiblen Form nicht verändern. In der kanonischen Form darf ich sie verändern. Genauso hier die 2 hoch5 kann ich einmal 35:17 als 2 hoch 5 darstellen und einmal als 2 und 5. Da merkt man, das bietet sich an, die eine Variante ist gut zum Anzeigen, die andere Variante ist besser zum 35:26 Sortieren. Ähm, die Normalisierung Form C, das ist die kanonische Dekomposition gefolgt von kanischer Komposition. Das 35:37 heißt, ich nehme das Zeichen erstmal auseinander und dann baue ich es wieder zusammen. Ähm, das löst das Problem Akzent und das 35:45 Problem Einheiten, weil wir kommen dann auf jeden Fall beim kombinierten Zeichen wieder raus, bei dem emarson und beim Omega. 35:55 Aber das lateinische A und das kyrdische A sind auch in der Normalisierungsform C noch unterschiedliche Zeichen. 36:03 Wir lernen daraus, die Normalisierung ist nicht notwendigerweise umkehrbar, weil ich in dem Moment, wo ich z.B. das Angström in das A mit Kreis umwandel, 36:13 die Information verloren habe, dass wä es hier mit einer physikalischen Einheit zu tun haben. Ich verliere also aus der Information, das ist eine physikalische 36:21 Länge von 10ström. Die Information verliere ich. Danach ist es nur noch die Zahl 10 gefolgt vom Buchstaben O. Ähm, wie will ich das sortieren? 36:31 Ist Ampere kleiner Angstö kleiner Celsius oder will ich da doch lieber auf die Zahl gucken, die da vorne dran steht 36:39 oder lasse ich es bleiben? Normalisierung verliert Information. Das heißt, eine Applikation muss sich entscheiden, wie sie einen String 36:49 abspeichert. normalisiert oder nicht normalisiert und wie sie ihn verarbeitet. Da gibt's verschiedene Möglichkeiten. Ich kann jetzt den String 36:56 unnormalisiert abspeichern und die Normalisierung immer wieder machen, wenn ich wenn ich ihn vergleichen möchte, wenn ich es vergleichen oder sortieren 37:04 möchte. Das frisst Rechenzeit. Ich kann es normalisiert speichern, dann verliere ich Information. Ähm, ich kann es auch in beiden 37:13 Varianten speichern. Das ist sicherlich für CPU Zeit die einfachste Variante, aber das frisst Speicher. 37:22 Sucht euch euer Gift aus. Ähm, der Standard enthält Tabellen zur Normalisierung. Das ist also nicht immer durch Programm 37:34 durch Programmierung lösbar. Die volle Abdeckung ist aber nicht garantiert. Es gibt Fälle, wo Dinge ähnlich oder gleich aussehen, die aber trotzdem nicht 37:42 eininander zugeordnet sind. Das geht bei über das geht bei über bei über 150.000 Zeichen auch nicht anders. Ähm leider ist es trotzdem sicherheitsrelevant. Das 37:52 heißt, man möchte an sicherheitsrelevanten Stellen sich vielleicht doch ein bisschen Gedanken machen, ob man jetzt den kompletten 37:59 Unicode Sprachraum akzeptieren möchte oder ob man da doch sagt, ich habe jetzt Kunden aus der ganzen Welt, aber ich muss trotzdem nur die Zeichen erlauben, 38:10 die weltweit in irgendwelchen Namen im Einsatz sind. Also große Auswahl wirgt große Verantwortung. 38:18 Ähm damit bin ich jetzt mit meinem eigentlichen Vortrag durch. Ich habe noch ein bisschen Zeit und habe auch noch Zeit für Q&A. Dann erzähle ich euch 38:25 jetzt, wie dieser Vortrag entstanden ist. Ähm, ich habe vorhin schon erzählt, ich bin DBN Developer und ich maintaine 38:31 unter anderem so unwichtige Programme wie Adduser oder Sudo, die ähm auf sehr vielen Systemen installiert die auf sehr vielen Systemen installiert installiert 38:41 sind. Und letztes Jahr habe ich Adduser ein bisschen sicherer gemacht. Ähm, Adduser benutzt User Ad als Lowlevel Tool unten drunter und ich habe nachdem 38:52 nach dieser Sicherheitsveränderung ein Bugreport bekommen aus Osteuropa. Es ist eine es ist eine Regression. Ich kann meinen Namen nicht mehr als 39:00 Usernamen nehmen. Mein erster Gedanken war, aber ich habe doch gar nichts geändert. ähm geändert hatte sich User Ad und das 39:08 ist durch meine Sicherheitsveränderung rausgekommen. Da konnte man nämlich plötzlich nur noch ASKI Zeichen in Usernamen benutzen. Das will man ja auch 39:17 eigentlich so war so meine erste Idee. Ähm, aber andererseits habe ich mich gefragt, wie arrogent sind wir Europäer eigentlich? Warum nehmen wir Asiaten, 39:29 Russen und anderen Leuten, die keine lateinische Schrift benutzen, die Möglichkeit, ihren Usernamen als ihren Usernamen als ihren Namen als Usernamen 39:38 zu benutzen? Das ging doch früher auch schon die ganze Zeit. Ähm, das habe ich dann, wie ich brav bin, ein bisschen mit meinen anderen Developern ausdiskutiert. 39:48 Ähm, die Reaktion war Unisono, das ist Unsinn, lass das. Und ähm das stand dann auch eine Woche später in der Linux Wikly News und das hat mich dann dazu 39:59 veranlasst, dass ich ein bisschen Standards und Dokumentation gelesen habe. 40:08 Ich kam zu dem Ergebnis, okay, das ist aufwendig, aber wir haben Libraries. Es gibt die Lip Unicode, die diese Frage mit mit Vergleichen und mit 40:19 Vergleichen und sortieren relativ gut erledigt. Aber Adduser ist Top 5 in Popcorn. Es ist auf ziemlich vielen Systemen 40:28 installiert und es ist dem Installer. Der Installer möchte klein sein. Ähm, also ist Adduser so gebaut, dass Libraries 40:37 nur benutzt werden, wenn es wirklich überhaupt nicht anders geht. Ähm, ich habe dann glücklicherweise eine Ausrede gefunden, nämlich den den RFC 8265 40:46 Preparation Enforcement and Comparison of Internationalized Strings Preise. Und da steht praktischerweise drin für Usernamen, für Usertifier nehmen wir 40:56 USaskey und noch ein paar wenige Sonderzeichen und bitte nicht mehr. Also haben wir es gelassen mit den UTF8 Usernamen. 41:10 Posix. Also die Frage war, was sagt denn POSX? POSIX sagt auch nur ASKI und ein paar Sonderzeichen. System D hat auch eine eigene Regel. Das ist die schärfste 41:19 von allen. Ähm, aber nach aber an Posex interessieren sich nicht mehr so viele Leute. 41:32 Noch weitere Fragen? Der Kollege kommt gleich mit dem Genau. Ja. Äh Mikrofon. Erstmal großen Applaus an Mark 41:40 [Applaus] und wir haben noch ungefähr 20 Minuten für Q&A. Das heißt, ihr könnt euch 41:47 richtig gönnen. Und draußen wird schon gegrillt. Vielen Dank für diesen fantastischen Vortrag. Äh, ich habe eine Frage. Gibt 41:56 es bei UTF8 irgendwie ein Anfangsbit, das sagt so, pass mal auf, für das nächste Zeichen verwende ich jetzt die und die Breite. Äh, vielleicht habe ich 42:04 das überhört, dass man sagt, also wenn das von einem bis vier Bitte möglich ist, dann könnte man ja sagen, also ich habe bin UTF8 und erwarte für das 42:14 kommende Zeichen bitte zwei Bitte und das und diese Information muss ich ja auch irgendwo lassen. Das ist diese Definition hier oben. Ähm, 42:23 alles was mit einer Null anfängt ist ein Beit. Alles was mit 10 anfängt ist sind zwei Bites. Alles mit alles was mit 10 100 anfängt sind dreit. Und alles, was 42:33 mit vier ein und einer null anfängt sind vier Bit. Danke schön. Vielen Dank. Da hinten noch. Ja, 42:44 genau. Beantworte du bitte einmal. Ja, war schon richtig. Du bist dran und wenn du fertig bist, bitte an den Menschen hinter dich 42:49 weitergeben. Ähm, es heißt aber auch, dass ich eigentlich 42:57 jede Anwendung, also auch die uralten Unix Tools updaten müsste, um damit auch umzugehen, weil na ja, früher hat man auf dem Char Array 43:07 rumeriert und hat gedacht, na ja, reicht ja. Und was würdest du oder Frage 43:16 selber implementieren gar nicht mehr? Also benutzt eine Library oder? Das würde ich so sagen. Ja, das ist ein ultra kompliziertes Thema. Ich glaube 43:24 nicht, dass ich glaube nicht, dass du das hinbekommst, wenn du das nur nebenbei in einem anderen Entwicklungsprojekt machen möchtest. Das 43:32 ist zumindest die Entscheidung, die ich für Adduser und mich getroffen habe. Ähm, ich habe noch andere Hobbys als UTF8 zu implementieren, wo es die 43:41 Library schon gibt, aber die Library zu groß ist. Ähm und die zweite Frage, ähm wie viele Tools gibt's eigentlich noch 43:49 in dem aktuellen Debien, die nicht um damit umgehen können mit mit ordentlich mit UTF8, sondern immer noch der Meinung sind, na ja, 44:00 ähm eben die die 8 Bit Codierung ist völlig ausreichend. Spontan würde ich sagen sehr sehr viele, 44:09 weil weil weil in den meisten Fällen funktioniert es ja. kaputt. Mm. 44:20 Bei Cut kann man halt z.B. nicht mehr sagen, gib mir mal die Spalten 12 bis 15, wenn da vorne ein UTF8 Zeichen dran stehen könnte. 44:32 Ja, danke. Ähm, wenn der naive Programmierer für um zwei Zeichen zu vergleichen, den Vergleichsoperator kleiner benutzt, z. 44:43 Beispiel er macht sich ja normalerweise gar keine Gedanken, dass abhängig von seiner Umgebung, Betriebssystem, Programmier Umgebung und so weiter die 44:51 Bedeutung eine beliebige ist. Das heißt, die Portabilität ist da überhaupt nicht gegeben. Und was so Vergleichbarkeit anbetrifft, glaube ich, da können wir 44:59 ruhig auch Fatalisten sein, weil wir können transformieren, wie wir wollen. Wir kommen nicht dran an die Komplexität, die für das Sortieren von 45:08 den guten alten Telefonbüchern gefordert war, in z.B. Müller und Söhne mal Müller mit UE mal mit Ü und das und mal als Kaufmanns und mal als ausgeschrieben und 45:19 wenn das so hinter wie soll das überhaupt sortiert werden? Ich glaube die die Regeln dazu heißen ABC Regeln sind glaube ich über eine Vornorm nie 45:28 hinausgekommen. Und noch kleine Anekdote, die Österreicher, die hatten sich es früher einfach gemacht. Die hatten im Telefonbücher, Telefonbüchern 45:35 die Umlaute einfach hinter hinter dem Z an ansortiert. Die haben anscheinend eine ganz primitive Sortierung gemacht, ohne sich groß Gedanken zu machen. 45:44 Das wird vermutlich sogar die naive die naive Sortierung auf elektronischer Art und Weise gewesen sein, weil die Umlaute stehen ja in den 8859 45:54 Zeichensätzen auch ganz hinten und in Schweden ist das heute noch so, also dass man ein A wie ein R sortiert, das ist noch nicht rel das ist glaube ich in 46:03 Deutschland noch nicht so lange so. Ähm, ansonsten würde ich erwarten, dass die LIP UUTF8 mir einen funktionierenden 46:13 kleiner Gleichoperator bereitstellt, der natürlich nicht mit UE und Ü umgehen kann, weil das ist ein deutscher Sonderfall, dass sowas um dass sowas 46:21 umschrieben wird. Ich glaube, das macht man nur in Deutschland, aber auch das wäre auch etwas, was man in der Library eigentlich eigentlich abbilden könnte. 46:29 Ich kenne nur keine davon. Ich weesprochen werden oder als 46:41 kann ja auchen. Ja, aber also der Einwurf war der der Einwurf war, dass es das E in verschiedenen in verschiedenen Varianten 46:49 gibt, nämlich einmal als Umlaut E und einmal als Dehnungse. Das gibt's ja auch als Iogrävenbruch. Ähm, aber ich glaube, das ist jetzt 46:58 Aussprache. Ich glaube, man sortiert Grevenbruch nicht anders, als würde man es Grevenbräuch sprechen. Also, ich meine, dass es in Unicode 47:07 Collations gibt, die man angeben kann und da gibt's meine ich auch für Deutsch äh verschiedene, damit man halt verschiedene Varianten hat, wie man die 47:15 S einsortiert und die muss man dann halt auswählen. Deswegen kann man auch teilweise, ich meine bei Java angeben, wie man die ganze Sortierung haben will, 47:23 nach welchem nach welcher Sprache sozusagen und da eventuell auch noch mal ob nach Telefonbuch oder nach anderen Konventionen. 47:30 Na, dann ist ja alles gut. Ich dachte immer ist halt sau kompliziert dann, man muss das richtige angeben, kann auch nicht 47:36 alle Fälle dann abdecken, aber ich dachte immer die Collations, die man ja auch bei Datenbanken beim Anlegen von Feldern oder beim Anlegen von äh von von 47:46 Tabellen angeben muss, dass das im Wesentlichen auch anzeigt, ob man jetzt 8859 irgendwas oder UTF8 benutzen möchte, aber das ist innerhalb von 47:53 fahren fahren fahren UTF8 auch noch andere Varianten gibt, die solche alltäglichen Probleme angehen. finde ich gut. Wusste ich auch noch nicht. 48:02 Und auch lower. Ja, also Collations unterscheiden auch, ob es CAS sensitiv oder nicht Kensitiv 48:11 vergleicht und sortiert. Ja, wie ist es denn bei Suchen und Regular Expressions? Wenn ich jetzt irgendwie da etwas angebe, wie ein 48:19 großes A, würde ich vielleicht nicht unbedingt erwarten, dass Alpha und das kurillische da A gefunden werden. Andererseits ist es aber vielleicht 48:28 sinnvoll, wenn ich ein kleines S angebe, dass wenn Texte mit langem S da sind, was ja ein anderer Codeband ist, die dann schon mit ausgewählt werden. Wie 48:37 wird das gehandhabt und was erwartet man da eigentlich? Also in vielen Tools passen sich die passen sich die regulären Ausdrücke an das gesetzte 48:46 Local an. Das macht dann den Unterschied, ob du deedde oder DEede.f8 gesetzt hast. Dann ähm und ich würde erwarten, dass in dass ähm wenn ich ein 48:58 deutsches Lokell gewählt habe, das A bis Z auch die Umlaute umfasst und zwar egal, ob es größer oder kleiner ist. Mir fällt gerade noch was ein zu dem Einwurf 49:08 aus der Ecke von vorhin. Ähm in Python muss man sich die muss man sich diese Gedanken nicht machen. Python macht es richtig, aber soweit ich weiß gibt es 49:18 keine andere Programmiersprache, wo man das nicht zumindest mal einschalten muss, die UTF8 Behandlung. Ich könnte mir vorstellen, dass Pearl es auch 49:25 richtig macht, wenn man gesagt hat, use UTF8. Ähm ob C das richtig macht, da bin ich mir fast sicher, das nicht. In C++ könnte ich mir vorstellen, dass der 49:34 kleiner, dass der kleiner Operator für die Stringklasse entsprechend überladen ist, dass es da auch irgendwelche Settings gibt, aber dazu bin ich zu 49:41 wenig Entwickler, um das jetzt beurteilen zu können. Ja, warte, ich komme zu dir. 49:51 Nur noch eine kleine Anekdote. Äh, du hast ja auch noch von Epstick von IBM berichtet, das war ja keine Norm, sondern nur ein Industriestandard. Äh, 50:00 dummerweise wurde dieser Standard nicht nur von IBM benutzt, sondern von auch einer von einer deutschen Firma in die in Erlangen beheimatet ist. äh und die 50:10 hatte deren SSD Codierung hatte deutliche Änderungen gegenüber sie gegenüber habe ich mich versprochen gegenüber IBM 50:18 natürlich und die haben es fertig gebracht äh auf unterschiedliche Zeichenbelegung zu haben auf Tastatur, Bildschirm und 50:27 Drucker und alle drei Komponenten waren vomselben Hersteller. Man kann es hinkriegen, man kann Inkompatibilitäten hinkriegen, wenn man 50:34 sich nur genügend Mühe gibt. Man kann den Firmennamen auch als Akronym lesen, das mache ich jetzt aber nicht im Stream. 50:41 [Musik] Alles klar? Gibt's noch weitere Fragen? Anmerkungen oder so da vorne noch? Moment. äh könnt man rechnen. 50:53 Ja, noch mal mal zu der äh Reduktion der erlaubten Zeichen äh für Usernamen. Ähm trifft das dann in gleicher Ebene auch für die Passwörter 51:03 zu? Äh nein, absichern will. Die darf ich dann voll mit einem 51:09 Da würde ich davon ausgehen, das ist ja nicht sicherheitsrelevant. Da ist das Schlimmste, was du was passiert ist, dass die Authentifikation ist, dass du 51:15 dich nicht einloggen kannst. Das wird dich jetzt als Ingenieur mal ähm als Versagen zur sicheren Seite annehmen. Ähm 51:24 alles klar. Noch weitere Fragen oder war da noch was? Ach, da ist noch einer. Sehr gut. 51:33 Das kommt drauf an, wie du die Sicherheit siehst. Nicht funktionierendes System ist sicher, weil nichts passiert. 51:39 Der sicherste Computer ist in einem Betonklotz eingegossen mehr versenkt ohne Schnittstellen nach draußen und ohne Strom. 51:46 Dass man den dass man ihn dann nicht mehr benutzen kann, ist manchen Sicherheitsabteilungen in Konzernen noch nicht so ganz klar, aber wir wissen das. 51:54 Aber was ich auch noch mal eben noch mal sagen wollte, ist wahrscheinlich ist es dann besser. Ja, also wenn man Sicherheit 52:02 machen will, gerade sowas wie Benutzernamen und solche Vergleiche, dass man sich dann, sag mal, das Problem delegiert und 52:11 sagt, okay, ich benutze Sicherheit delegere ich an was auch immer an entsprechendes System und das soll mir dann gefällig bitte einen richtigen 52:20 Usernamen geben und eben ich mache das ein Problem anderer Leute, nicht, dass ich die Sicherheit selber machen will. Beispielsweise schon mal ähm ist sind 52:28 die Usernamen identisch. Und ich hoffe mal, dass diese Leute ähm eben die ganzen Probleme von UTF 8 und oder Unicode im generellen kennen, dass ich 52:41 das nicht selber machen will. Ich glaube, es war schon immer eine gute Idee, die Sicherheit nicht selber machen zu wollen. 52:47 In der Praxis, insbesondere bei größeren Installationen, wirst du deine Usernamen in deine Usernamen in irgendeinem 52:54 Verzeichnisdienst haben und der wird dir auch nicht den Usernamen und den Passworth hash geben, sondern du wirst ihn fragen, ich habe hier den User, der 53:00 versucht sich so zu identifizieren. Ja, nein, vielleicht. Und ähm damit ist das Problem 53:10 auch das. Ja, auch das geht natürlich, aber wie gesagt, bei mir ist das in Adduser entstanden. Da bin ich der Verzeichnisdienst bzw. ich konfiguriere 53:20 den Verzeichnisdienst ETC PasswD auch ein Verzeichnisdienst. Okay, noch mehr Fragen, noch mehr Anmerkung. Jetzt ist eure Chance. Ah, 53:30 sehr gut. Ja, auch von meiner Seite noch mal vielen Dank für ein Vortrag, Mark. Ich 53:38 habe am Anfang gedacht, na ja, wie kompliziert kann es denn sein, ne? Aber schlimmer geht immer, ne? Das bewahrheitet sich. Ähm 53:45 man kann damit jede Menge Spaß haben für passende Werte von Spaß. Ja. Ähm noch mal zum Verständnis eine Geschichte. Das heißt, wenn ich jetzt 53:52 drei Zeichen hintereinander habe, also ein ein A, ein Axon und ein E, dann weiß ich nicht, zu welchem der Zeichen des Axor gehört. Also, ob es zum A gehört 54:01 oder zum E. Das ist eine gute Frage. Eigentlich müsstest du das wissen. Da müsste man noch mal nachlesen. Eventuell ist das doch ist das doch gezeichnet, 54:08 dass der dass der dass der Acent immer dass der Modificator, dass es eine Eigenschaft gibt. Dieses Zeichen ist ein Modificator und das bezieht sich dann 54:16 entweder auf das Zeichen vorne und und auf das Zeichen hinten. Also ich würde Unicode zutrauen, dass es unterschiedliche 54:21 Modifikatoreigenschaften für den vorderen und für den hinteren Buchstaben hat, aber natürlich ist das nicht ganz frei, 54:28 weil dann, weil dann ist es ja mehrdeutig. Vielen Dank. Ja. Ja. Okay. 54:37 Alles klar. Ihr habt noch ungefähr vier Minuten. Das heißt, wenn euch noch was auf der Seele brennt, re jetzt euch hält keiner hier. Es ist 54:45 also von mir aus können wir zum Grillen gehen. Genau. Echt jetzt oder? Okay, gut. 54:51 Aber einen kleinen habe ich noch. Ähm, genau. Eine eine ist noch gekommen und zwar ähm wenn ich jetzt ein ich habe eine Datei und habe keine Ahnung, 54:59 welches äh welche Codierung verwendet worden ist. Gibt's ein gutes Tool oder eine gute Bibliothek, in die ich das reinwerfen 55:06 kann und die mir von mir aus auch mit Wahrscheinlichkeiten, man weiß wo welches Zeichen steht und so weiter, also die mir relativ gut erkennt, was es 55:14 denn hätte sein müssen wahrscheinlich. Ich glaube, es gibt dann nur Höristiken. Freiel sagt dir, es ist ein UTF8 Text oder es ist ein 8 Bit ASK. 55:24 Aber das kann vermutlich die das das wird vermutlich die unterschiedlichen 8859 Varianten nicht voneinander unterscheiden können. Ähm, was man 55:32 feststellen kann, ja, das ist valides UTF8 und damit ist klar, dass es nichts anderes ist. Ähm, wenn es nicht valides 55:41 UTF8 ist, dann kann man im Wesentlichen nur noch würfeln. eine, 55:51 also ich hatte das Vergnügen schon mal, es gibt da vom IBM eine Library ICEU und die gibt's dann noch für Java ICU for J, die ist riesig. Ich glaube irgendwie 46 56:00 Megb Textdata Referenzmaterial. Da schiebt man dann seine Daten rein und dann kriegt man eine Prognose, was es denn sein könnte und dann kann man äh 56:10 schauen, wie sicher ist sich die Library für jeden Trefferm und äh wenn einem das dann reicht, kann man dann die den Treffer mit der 56:16 höchsten Wahrscheinlichkeit annehmen und dann den Text halt dann in UTF8 beispielsweise für Java dann was da verwendet wird, dann rumakodieren. 56:23 Das stimmt. Lip ECU sehe ich manchmal in irgendwelchen Security Updates aufpoppen, dass die geupdatet wird. Kein Spaß, macht jede Anwendung riesig und 56:31 das Ergebnis ist halt auch nur gut. Ich kann mir ehrlich gesagt auch nicht vorstellen, dass das irgendwie ohne Wörterbücher abgeht. 56:39 Wir kriegen gerade signalisiert Times ab. Vielen Dank. Genau. Noch mal ein großer Applaus. Danke für Vortrag. 56:47 [Applaus]