Heim  >  Artikel  >  Java  >  Randfälle, die Sie im Hinterkopf behalten sollten. Teiltext

Randfälle, die Sie im Hinterkopf behalten sollten. Teiltext

王林
王林Original
2024-08-09 06:41:221005Durchsuche

Edge Cases to Keep in Mind. Part  Text

Egal, ob Sie Softwareentwickler, Texter oder einfach nur eine E-Mail schreiben, Text birgt viele Fallen, die Sie beachten müssen. Einige können zahlreiche Probleme verursachen, von Fehlern in Ihrer App über visuelle Artefakte bis hin zu Opfern! Werfen wir einen Blick darauf, wie wir sie vermeiden können.

Hintergrund

Text (auch bekannt als Strings) gibt es in praktisch allen Softwareprojekten, von Einzeilern wie „Hallo Welten“ bis hin zu Unternehmenssystemen mit Milliarden von Codezeilen, unabhängig von der Programmiersprache, Plattform usw. Texte sind nur Zeichenfolgen, das sollte also kein Hexenwerk sein, oder? Schauen wir uns an, auf welche Fallen Sie stoßen können!

Briefkasten

Einige der weltweiten Alphabete (einschließlich Englisch) sind zweikammerig, was bedeutet, dass sie sowohl Groß- als auch Kleinbuchstaben enthalten.
Beispiel: a ist ein Kleinbuchstabe und A ein Großbuchstabe. Die Umstellung von einem Briefkasten auf einen anderen ist ein recht häufiger Vorgang.

Die Groß-/Kleinschreibung mag trivial erscheinen – ein Zeichen wird einfach in ein anderes umgewandelt (zugeordnet). Es kann sogar ein eigenständiges Zeichen sein, wenn es kein Buchstabe ist, z. B. 1 oder + usw. Darüber hinaus kann diese Zuordnung jederzeit einfach umgekehrt werden, z.B. A->a und a->A. Auf den ersten Blick scheint also alles in Ordnung zu sein. Nun, nichts könnte weiter von der Wahrheit entfernt sein!

Fehler in der Groß-/Kleinschreibung können tödlich sein

Das ist kein Witz und wir reden hier nicht von wütenden Grammatik-Nazis. Wie Sie in diesem Artikel lesen können, verursachte ein Gehäusefehler zwei Opfer und brachte drei weitere Personen ins Gefängnis.

Wie ist das passiert? Nun, im Türkischen (und Aserbaidschanischen) haben wir zwei verschiedene i-Buchstaben: punktiert (geschlossen) und punktlos (offen). Im Englischen und anderen lateinischen Alphabeten sind Kleinbuchstaben immer punktiert, während Großbuchstaben punktlos sind. Alles ist in Tabelle 1 dargestellt. und Online-Demo.

Tabelle 1. Gepunktete und punktlose i-Buchstaben.

Lowercase Uppercase
English i dotted I dotless
Turkish i dotted İ dotted
Turkish ı dotless I dotless

Wie Sie sehen, hängt das Ergebnis der Änderung der Groß-/Kleinschreibung vom Kontext ab, der wiederum von der aktuellen Sprache abhängt. Beim Verfassen von Texten, die sich an Menschen richten, ist es wichtig, eine angemessene Sprache zu verwenden. Wenn Ihnen das egal ist, könnten Ihre Worte am Ende eine andere Bedeutung haben als beabsichtigt.

Andererseits sollten maschinenlesbare Texte wie HTTP-Header oder JSON-Schlüssel sprachneutral verarbeitet werden. Andernfalls erhalten Sie möglicherweise Nicht-ASCII-Zeichen in der Ausgabe, die die Anwendungslogik beeinträchtigen können. Genau diese Situation ereignete sich in GSON, einer Bibliothek, die von Tausenden (oder vielleicht Millionen) Projekten verwendet wird.

Die Geheimnisse der diakritischen Zeichen

Zeichen mit diakritischen Zeichen können wie ó vorkomponiert oder durch Kombination von Zeichen wie ó erstellt werden. Beim Lesen dieser Seite sehen beide aus wie derselbe Charakter. Wenn Sie sich jedoch den Hexdump des zweiten Elements ansehen oder sogar versuchen, seine Länge programmgesteuert zu ermitteln, wie in dieser Demo, werden Sie feststellen, dass es aus zwei einzelnen Zeichen besteht: dem lateinischen Kleinbuchstaben „o“ und einem kombinierten akuten Akzent. Ebenso kann jeder Silbenblock des Hangul (koreanisches Alphabet) vorab zusammengesetzt oder als Kombination verschiedener Jamos-Einzelbuchstaben/-Zeichen geschrieben werden.

Warum ist die Kombination von Noten so wichtig? Nun, es gibt zwei Möglichkeiten, die meisten Zeichen mit diakritischen Zeichen zu schreiben (zum Beispiel aus dem polnischen, ungarischen oder tschechischen Alphabet). Dies macht Vorgänge wie Sortieren, Suchen oder Messen der Textlänge nicht trivial. Um die beste Benutzererfahrung zu erzielen, müssen Texte normalerweise normalisiert (in eine der Normalformen konvertiert) werden. Andernfalls könnten Benutzer verwirrt sein, wenn sie beispielsweise mehrere „verschiedene“ Anmeldenamen oder Dateinamen sehen, die gleich aussehen. Ein gutes Beispiel dafür ist die Art und Weise, wie Slack mit Kanalnamen umgeht. Sie werden vor der Kanalerstellung normalisiert, sodass Situationen, in denen derselbe Name auf unterschiedliche Weise geschrieben wird, nicht nebeneinander existieren können.

Manche Charaktere sind gleicher als andere

Es gibt zwei Ebenen der Zeichenäquivalenz. Kanonische Äquivalenz tritt auf, wenn angenommen wird, dass Zeichen sowohl die gleiche Bedeutung als auch das gleiche Aussehen haben, z. B. die oben genannten ó und ó unterscheiden sich nur durch die (technische) Schreibweise. Andererseits bedeutet Kompatibilität, dass Zeichen möglicherweise unterschiedlich erscheinen, aber möglicherweise dieselbe Bedeutung haben. Beispielsweise ist die Ligatur ffi mit drei unterschiedlichen Buchstaben ffi kompatibel, sie sind jedoch kanonisch nicht gleich. Weitere Informationen zur Unicode-Normalisierung finden Sie in der Standarddokumentation.

Während sowohl die zusammengesetzten als auch die zerlegten Formen für jeweils zwei Ebenen standardisiert sind – wir haben also insgesamt vier Normalformen – ist die Normalisierung nicht immer umkehrbar. Zum Beispiel wird ein Angström-Zeichen Å in den lateinischen Großbuchstaben A A plus den Kombinationsring darüber ̊ zerlegt, der wieder zu einem lateinischen Großbuchstaben A mit einem Ring über Å zusammengesetzt wird, nicht in das Angström-Zeichen, aus dem es stammt.

Combo-Normalisierungsfehler verursachen Abenteuer

Es ist auch wichtig, dass alle Anwendungen, die einen bestimmten Text teilen, dieselbe Normalisierungsmethode verwenden. Andernfalls kann es zu subtilen Fehlern und/oder sogar zu stillen Datenverlusten kommen. Solche Fehler können schwer zu entdecken sein, da jede Anwendung fehlerfrei funktioniert, zumindest wenn sie einzeln ausgeführt wird. In solchen Fällen „stürzen“ Anwendungen häufig nicht ab, sondern senden oder empfangen Daten nur anders als vorgesehen, was unbeabsichtigte Folgen haben kann. Ein solches Beispiel ist dieser Fehler in Nettalk.

Die oben genannten typografischen Ligaturen werden verwendet, um das visuelle Erscheinungsbild bestimmter Zeichen zu verbessern, die einzeln nebeneinander nicht gut aussehen. Um Ligaturen müssen sich die meisten Nutzer keine Sorgen machen, da diese automatisch aus einzelnen Buchstaben durch Software, z.B. TeX erzeugt standardmäßig Ligaturen. Entwickler solcher Tools müssen jedoch berücksichtigen, dass Ligaturen in manchen Fällen unangemessen sein und zu Fehlern führen können.

Schauen Sie sich das an: fi. Ist der zweite Buchstabe punktiert oder punktlos? Türkischsprachige Leser könnten verwirrt sein. Ligaturen, die i enthalten, sollten in manchen Kontexten nicht verwendet werden.

Wo ist mein Großbuchstabe?

Einige Schriften (sogenannte Zweikammerschriften) wie Latein und Griechisch enthalten Buchstaben mit zwei Fällen. Nahezu alle Buchstaben haben Klein- und Großschreibung. Praktisch... aber nicht absolut alle!
Während die Kleinschreibung immer vorhanden ist, gilt dies nicht für Großbuchstaben. Wenn es also Zeichen gibt, die nur aus Kleinbuchstaben bestehen, was passiert dann, wenn Sie versuchen, sie in Großbuchstaben umzuwandeln? Wäre es ein Fehler, der dazu führt, dass der Vorgang fehlschlägt? Würde der Charakter derselbe bleiben? Die Antwort ist nichts dergleichen!

Eines der auffälligsten Beispiele ist das deutsche scharfe s — ß. Es ist ein Kleinbuchstabe und wird, wenn es in einen Großbuchstaben umgewandelt wird, zum doppelten S - SS. Diese Transformation ist nicht umkehrbar – SS wird zu SS. Sehen Sie es online. TL;DR Unicode 5.1 führte ẞ (LATEINISCHER GROSSBUCHSTABE SCHARF S) ein, wird jedoch im Hinblick auf die Zeichenzuordnung im Allgemeinen nicht als Großbuchstabe von ß betrachtet. Es wurde kürzlich (im Jahr 2016) als ebenso gültige Form von SS in die deutschen Orthographieregeln aufgenommen.

Viele andere Kleinbuchstabenligaturen haben keine entsprechenden vorkomponierten Großbuchstabenformen. Die vollständige Liste finden Sie in der Unicode Special Casing-Dokumentation.

Die Doppel- oder Dreifachprobleme

Einige Großbuchstaben fehlen, na und? Ligaturen können aus 2 oder sogar 3 Zeichen bestehen, sodass groß geschriebener Text möglicherweise dreimal länger ist als der ursprüngliche Kleinbuchstabe. Dieser Umstand ist besonders wichtig, wenn die resultierende Textlänge begrenzt ist. Zum Beispiel in Avataren oder Initialengeneratoren, wie in diesem Fehler auf bitrise.io.

Der mysteriöse dritte Fall

Das griechische Alphabet enthält den Sigma-Buchstaben, der in Großbuchstaben so aussieht: Σ. Was ist die Kleinschreibung? Nun, es kommt darauf an! Normalerweise ist es σ (nicht endgültig), aber am Ende der Wörter ist es ς (endgültig). Wenn jedoch ein Sigma der einzige Buchstabe ist oder das Wort in Großbuchstaben geschrieben ist, wird immer eine nicht endgültige Version verwendet, auch an der endgültigen Position. Siehe interaktives Beispiel.

Noch ein Randfall

Was ist der Kleinbuchstabe eines lateinischen Großbuchstabens i mit Tilde Ĩ? Wie Sie vielleicht schon vermutet haben, ist die Antwort nicht so trivial. Eine entsprechende Kleinschreibung existiert. Beide Formen sind punktlos, aber das ist völlig normal. Sowohl i als auch j haben keine Punkte, wenn ihnen diakritische Zeichen angehängt sind. Was ist hier also das Problem?

Neben dem Türkischen sind auch die litauischen ortografischen Regeln im Fall des I-Buchstabens eine Ausnahme. Im letzteren Fall bleibt der Punkt unter dem Akzent erhalten. Das bedeutet zum Beispiel, dass das oben erwähnte Ĩ, wenn es im Kontext der litauischen Sprache klein geschrieben wird, zu i̇̃ wird. Wenn Sie genau hinschauen, können Sie erkennen, dass es drei Zeichen gibt: einen lateinischen Kleinbuchstaben „i“, einen verbindenden Punkt darüber und eine kombinierende Tilde darüber. Die Länge des Textes hat sich (wieder) verdreifacht.

Machen Sie weiter mit Ligaturen und Multigraphen

Wie kann man ein Wort mit 7 Buchstaben und nur 6 Zeichen schreiben? Verwenden Sie einfach vorkomponierte Ligaturen und Multigraphen (Digraphen, Trigraphen usw.)! Natürlich gibt es nicht für jede mögliche Kombination zusammengefügter Buchstaben ein vorgefertigtes Zeichen. Bestehende können jedoch genutzt werden, um die Textlängenbegrenzungen effektiv zu erhöhen. Beispielsweise besteht ein schlesisches Wort dzbonek (ein Topf) aus 7 Buchstaben, kann aber mit nur 6 Zeichen als dzbonek geschrieben werden. Sehen Sie es online. Beachten Sie, dass dz ein Digraph und keine Ligatur ist.

Jetzt können Sie beispielsweise Nachrichten mit mehr als 140 Zeichen twittern! Die Liste der vorkomponierten Unicode-Digraphen und Ligaturen finden Sie hier.

Wenig bekannte Möglichkeiten zur alphabetischen Reihenfolge

Die alphabetische Reihenfolge wird üblicherweise zu Beginn der Grundschule vermittelt. A, B, C, D… und so weiter bis Z. Kinderleicht!

Leider hängt die alphabetische Reihenfolge von der Sprache ab. Sogar die Positionen der lateinischen Grundbuchstaben (ohne diakritische Zeichen) können unterschiedlich sein. Im Estnischen steht beispielsweise der Buchstabe Z zwischen S und T.

Die Position von Buchstaben mit diakritischen Zeichen ist ebenfalls nicht universell. Es gibt mehrere mögliche Schemata:

  1. Vor dem entsprechenden Grundbuchstaben, wie auf Maltesisch: W, X, Ż, Z.

  2. Nach dem entsprechenden Grundbuchstaben, wie im Polnischen: A, Ą, B, C, Ć.

  3. Am Ende des Alphabets, wie auf Schwedisch: Z, Å, Ä.

  4. An der gleichen Position (für Sortierungszwecke) wie der Grundbuchstabe, wie im Ungarischen: O=Ó.

Beachten Sie, dass derselbe Brief in verschiedenen Sprachen unterschiedlich sortiert sein kann und je nach Kontext sogar in derselben Sprache unterschiedlich sein kann!. Beispielsweise steht im Slowakischen ein A mit Umlaut immer nach A. Im Deutschen kann es jedoch entweder den gleichen Wert wie die nicht umlautete Version haben, danach stehen oder sogar als A+E behandelt werden. Weitere Informationen darüber, welche Art und Weise in welchen Fällen verwendet wird, finden Sie hier.

Brot, Kasse und Casino

Es sind nicht nur einzelne Briefe, die der Sortierung unterliegen. Multigraphen können auch ihre eigenen Regeln haben. Im Slowakischen wird CH zwischen H und I eingeordnet. So wird beispielsweise das Wort chlieb (ein Brot) nach hodina (eine Stunde) eingeordnet. Andererseits wird dieser Digraph im Polnischen wie zwei separate Buchstaben – C und H – behandelt und unterliegt daher keinen besonderen Sortierregeln. Sehen Sie es online.

Ungarisch hat sogar doppelte Digraphen und jeder von ihnen hat seine eigenen Kollationsregeln. Dies führt zu vielen komplizierten Fällen. Betrachten wir ein mögliches Beispiel. Wir haben den SZ-Digraphen. Es wird nach S sortiert. Seine doppelte Version (SZ + SZ) ist ein SSZ. Das bedeutet, dass das Wort kaszinó (Kasino) vor kassza (Registrierkasse) stehen sollte. Normalerweise steht Z nach S, aber hier haben wir: K A SZ I im ersten Wort und (ein Äquivalent von) K A SZ SZ im zweiten.

Darüber hinaus kann dieselbe Buchstabengruppe je nach Kontext ein (doppelter) Digraph sein oder auch nicht. Beispielsweise wird das oben erwähnte slowakische CH in einigen Wörtern wie zwei separate Buchstaben C und H behandelt, z. B. viachlas (eine Polyphonie). Normalerweise ist im Ungarischen NNY = NY + NY, wie im Wort mennybolt (ein Himmel). Wir haben jedoch auch einen tizennyolc (achtzehn) mit NNY = N + NY, also gibt es einen einzelnen Buchstaben N und einen einzelnen Digraphen NY.

ΤНΙЅ ІЅ NОТ WНΑТ ΥО֍ ТНІNΚ ІТ ΙЅ

Sie denken vielleicht, dass die Überschrift oben nur aus einfachen lateinischen Buchstaben besteht. Tatsächlich handelt es sich bei der überwiegenden Mehrheit um griechische, kyrillische oder armenische Großbuchstaben. Sie sind nur die Homoglyphen einiger lateinischer Buchstaben.

A (lateinisches Großbuchstabe A) ist also nicht dasselbe wie Α (griechisches Großbuchstabe Alpha) oder А (kyrillisches Großbuchstabe A). Warum ist das wichtig? Da sie nicht unterscheidbar sind, können sie bei IDN-Homographenangriffen eingesetzt werden. Beispielsweise sieht die Domäne bank.com, die nur lateinische Buchstaben enthält, ziemlich genauso aus wie bаnk.com, die das kyrillische kleine A anstelle des lateinischen kleinen A enthält. Solche Domänen können für Phishing verwendet werden.

Einpacken

Der Umgang mit Text kann in manchen Fällen schwierig sein – insbesondere, wenn Sie in einer mehrsprachigen Umgebung arbeiten. Als Faustregel gilt, dass alle Konfigurationen für den jeweiligen Kontext geeignet sein sollten. Beispielsweise sollte bei der Verarbeitung von für diese Benutzer sichtbaren Texten die aktuelle Sprache des Benutzers berücksichtigt werden, während maschinenlesbare Texte sprachneutral (oder in Englisch, wenn dies nicht möglich ist) verarbeitet werden sollten. Die ausgewählten Sortiereinstellungen sollten ebenfalls mit der tatsächlichen Nutzung übereinstimmen. Text sollte bei Bedarf normalisiert werden und die gewählte Normalisierungsmethode sollte im gesamten System konsistent sein.
Möchten Sie mehr über Randfälle erfahren? Bleiben Sie dran, Teil 2 ist unterwegs!

Das obige ist der detaillierte Inhalt vonRandfälle, die Sie im Hinterkopf behalten sollten. Teiltext. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn