String-Klasse basierend auf Graphemen?

9

Ich frage mich, warum wir keine Zeichenfolgenklassen haben, die eine Zeichenfolge von Unicode-Graphemclustern anstelle von Codepunkten oder Zeichen darstellen. Es scheint mir, dass es in den meisten Anwendungen für Programmierer einfacher wäre, bei Bedarf auf Komponenten eines Graphems zuzugreifen, als sie von Codepunkten aus organisieren zu müssen, was notwendig erscheint, auch wenn nur vermieden werden soll, dass eine Zeichenfolge in "mid-grapheme" zufällig unterbrochen wird. (zumindest theoretisch). Intern kann eine Zeichenfolgenklasse eine Codierung mit variabler Länge wie UTF-8, UTF-16 verwenden, oder in diesem Zusammenhang hat sogar UTF-32 eine variable Länge. oder implementieren Sie Unterklassen für alle (und konfigurieren Sie die Auswahl optional zur Laufzeit, damit verschiedene Sprachen ihre optimalen Codierungen verwenden können). Aber wenn Programmierer bei der Inspektion eines Strings Graphemeinheiten "sehen" könnten, wäre das nicht der Fall.

Nassar
quelle
Ich denke, ein bisschen Zeit ist vergangen, und jetzt haben wir ein paar Sprachen, die dies tatsächlich tun. : D
Trejkaz

Antworten:

4

Der beste Weg, um Korrektheit zu erreichen, scheint darin zu bestehen, Programmierer davon abzuhalten, "String-Hacking" durchzuführen. Es ist einfach nicht in Ordnung, eigene Routinen für Zeilenumbruch, Silbentrennung, Wortanzahl, Rechtfertigung, Cursorbewegung usw. zu schreiben. Alle modernen UI-Frameworks werden diese Dinge heutzutage für Sie erledigen.

Das heißt, die Abstraktion, mit der Sie normalerweise arbeiten würden, ist eher ein "Absatzanzeigeobjekt", z. B. für GTK: http://library.gnome.org/devel/pango/stable/pango-Layout-Objects.html

anstelle einer Graphemzeichenfolge wie: http://library.gnome.org/devel/pango/stable/pango-Glyph-Storage.html

Um zu einer Zeichenfolge von Glyphen zu gelangen, benötigen Sie Informationen, die nur auf der Ebene "Ansicht" verfügbar sind. Daher verfügen die meisten Verwendungen von Zeichenfolgen möglicherweise nicht über diese Informationen. Zum Beispiel müssen Sie die Schriftart kennen, da Schriftarten unterschiedliche Ligaturen haben können.

Abgesehen von dieser Art von praktischer Angelegenheit sind Glyphen wahrscheinlich nicht das, was Sie wollen.

In vielen Kontexten möchten Sie die richtigen Unicode-Attribute verwenden, die in dieser API angezeigt werden, beispielsweise: http://library.gnome.org/devel/pango/stable/pango-Text-Processing.html#PangoLogAttr

Wie Sie an dieser Struktur sehen können (die die Unicode-Algorithmen widerspiegelt), ist es nicht korrekter, verschiedene Dinge an Glyphengrenzen auszuführen, als sie an Zeichengrenzen auszuführen.

Diese beiden Spezifikationen beschreiben die Algorithmen zum Auffinden verschiedener Arten von Grenzen:

Bei der Textverarbeitung müssen diese Grenzen mit den Algorithmen ermittelt und anschließend mit den Grenzen gearbeitet werden.

Wenn Sie sich damit befassen, wie schwierig es ist, alle Sprachen richtig zu handhaben, werden Sie sehr schnell feststellen, dass Sie eine Bibliothek benötigen, die ganze Absätze betrachtet und richtig behandelt. Windows, Mac, Linux (Qt und GTK) und Java verfügen alle über entsprechende Funktionen. Außerdem gibt es beispielsweise http://site.icu-project.org/ .

Wenn Sie Web-Apps schreiben, müssen Sie leider, soweit ich weiß, den Browser (wahrscheinlich vom Betriebssystem unterstützt) so ziemlich alles tun lassen. Alles, was Sie in JavaScript oder auf der Serverseite tun können, ist es durcheinander zu bringen.

Vielleicht würde ich die Antwort wie folgt zusammenfassen: Die meisten Manipulationen an Zeichenfolgen in Text in natürlicher Sprache sind fehlerhaft, daher macht es keinen Sinn, sich Gedanken über die Zeichenfolgenklasse zu machen, außer vielleicht eine ohne Methoden zu haben ;-)

Havoc P.
quelle