Classe de chaînes basée sur des graphèmes?

9

Je me demande pourquoi nous n'avons pas de classes de chaînes qui représentent une chaîne de grappes de graphèmes Unicode au lieu de points de code ou de caractères. Il me semble que dans la plupart des applications, il serait plus facile pour les programmeurs d'accéder aux composants d'un graphème lorsque cela est nécessaire que d'avoir à les organiser à partir de points de code, ce qui semble nécessaire même si ce n'est que pour éviter de casser une chaîne en passant par "mid-grapheme". (au moins en théorie). En interne, une classe de chaîne peut utiliser un codage de longueur variable tel que UTF-8, UTF-16, ou dans ce contexte, même UTF-32 est de longueur variable; ou implémentez des sous-classes pour chacune d'entre elles (et configurez éventuellement le choix au moment de l'exécution afin que différentes langues puissent utiliser leurs encodages optimaux). Mais si les programmeurs pouvaient "voir" les unités de graphème lors de l'inspection d'une chaîne,

nassar
la source
Je suppose qu'un peu de temps s'est écoulé, et maintenant nous avons quelques langues qui font cela. : D
Trejkaz

Réponses:

4

Il semble que la meilleure façon d'obtenir l'exactitude consiste à empêcher les programmeurs de faire du "piratage de chaînes" ... il n'est tout simplement pas correct d'écrire vos propres habillages de mots, coupures de mots, nombre de mots, justification, mouvement du curseur, etc. Tous les cadres d'interface utilisateur modernes feront ce genre de choses pour vous ces jours-ci.

C'est-à-dire que l'abstraction avec laquelle vous travaillez habituellement est plus un "objet d'affichage de paragraphe", comme pour GTK: http://library.gnome.org/devel/pango/stable/pango-Layout-Objects.html

plutôt qu'une chaîne de graphèmes, telle que: http://library.gnome.org/devel/pango/stable/pango-Glyph-Storage.html

Pour accéder à une chaîne de glyphes, vous avez besoin d'informations qui ne sont disponibles qu'au niveau de la "vue", donc la plupart des utilisations de chaînes peuvent ne pas avoir ces informations. Par exemple, vous devez connaître la police, car les polices peuvent avoir différentes ligatures.

Mis à part ce genre de questions pratiques, les glyphes ne sont probablement pas ce que vous voulez.

Dans de nombreux contextes, vous souhaitez utiliser les attributs Unicode appropriés, affichés dans cette API par exemple: http://library.gnome.org/devel/pango/stable/pango-Text-Processing.html#PangoLogAttr

Comme vous pouvez le voir dans cette structure (qui reflète les algorithmes Unicode), faire diverses choses aux limites des glyphes n'est pas plus correct que de les faire aux limites des caractères.

Ces deux spécifications décrivent les algorithmes pour trouver différents types de frontières:

Le traitement de texte implique de trouver ces limites avec les algorithmes, puis de travailler avec les limites.

Si vous commencez à comprendre à quel point il est difficile de gérer correctement toutes les langues, vous vous rendrez très vite compte que vous avez besoin d'une bibliothèque qui examine des paragraphes entiers et les gère correctement. Windows, Mac, Linux (Qt et GTK) et Java sont tous fournis avec des fonctionnalités pour cela, plus il y a http://site.icu-project.org/ par exemple.

Lors de l'écriture d'applications Web, malheureusement, vous devez à peu près laisser le navigateur (probablement aidé par le système d'exploitation) faire ce genre de choses, pour autant que je sache. Tout ce que vous pouvez faire en JavaScript ou côté serveur est de tout gâcher.

Peut-être que je résumerais la réponse comme suit: la plupart des manipulations de chaînes sur du texte en langage naturel sont brisées, donc pas grand-chose à se soucier de la classe de chaînes, à part peut-être d'en avoir une sans aucune méthode ;-)

Havoc P
la source