Maison > Java > javaDidacticiel > le corps du texte

Cas extrêmes à garder à l'esprit. Texte de la pièce

王林
Libérer: 2024-08-09 06:41:22
original
1003 Les gens l'ont consulté

Edge Cases to Keep in Mind. Part  Text

Peu importe si vous êtes un développeur de logiciels, un rédacteur publicitaire ou si vous écrivez simplement un e-mail, le texte comporte de nombreux pièges dont vous devez être conscient. Certains peuvent causer de nombreux problèmes, depuis des bugs dans votre application jusqu'aux victimes en passant par des artefacts visuels ! Voyons comment nous pouvons les éviter.

Arrière-plan

Le texte (c'est-à-dire les chaînes) existe dans pratiquement tous les projets logiciels, des one-liners comme hello-worlds aux systèmes d'entreprise contenant des milliards de lignes de code, quels que soient le langage de programmation, la plate-forme, etc. Les textes ne sont que des séquences de caractères, donc cela ne devrait pas être compliqué, n’est-ce pas ? Jetons un coup d'œil aux pièges que vous pouvez rencontrer !

Étui aux lettres

Certains alphabets du monde (y compris l'anglais) sont bicaméraux, ce qui signifie qu'ils contiennent à la fois des lettres majuscules et minuscules.
Par exemple : a est un caractère minuscule et A est une majuscule. La conversion d'une casse à une autre est une opération assez courante.

La casse peut sembler triviale : un caractère est simplement converti (mappé) en un autre. Il peut même s'agir d'un caractère en soi s'il ne s'agit pas d'une lettre, comme 1 ou +, etc. De plus, ce mappage peut toujours être simplement inversé, par ex. A->a et a->A. Donc, à première vue, tout semble bien. Eh bien, rien ne pourrait être plus éloigné de la vérité !

Les erreurs de boîtier peuvent tuer

Ce n’est pas une blague et nous ne parlons pas de nazis enragés de la grammaire. Comme vous pouvez le lire dans cet article, un problème de boîtier a fait 2 victimes et mis 3 autres personnes en prison.

Comment est-ce arrivé ? Eh bien, en turc (et en azéri), ​​nous avons 2 lettres i distinctes : en pointillé (fermé) et sans point (ouvert). En anglais et dans d'autres alphabets latins, les lettres minuscules sont toujours avec des points tandis que les majuscules sont toujours sans points. Tout est illustré dans le tableau 1. et la démo en ligne.

Tableau 1. Lettres i avec et sans points.

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

Comme vous pouvez le voir, le résultat du changement de casse dépend du contexte, qui dépend également de la langue actuelle. Il est important d’utiliser un langage approprié lors de la rédaction de textes destinés aux humains. Si cela ne vous intéresse pas, vos mots pourraient finir par avoir un sens différent de celui prévu.

D'un autre côté, les textes lisibles par machine comme les en-têtes HTTP ou les clés JSON doivent être traités de manière neutre en termes de langue. Sinon, vous risquez d'obtenir des caractères non-ASCII dans la sortie, ce qui pourrait interrompre la logique de l'application. Cette situation exacte s'est produite dans GSON, une bibliothèque utilisée par des milliers (voire des millions) de projets.

Les secrets des signes diacritiques

Les caractères avec des signes diacritiques peuvent être précomposés comme ó, ou créés en combinant des signes comme ó. À la lecture de cette page, ils ressemblent tous les deux au même personnage. Pourtant, si vous regardez le hexdump du second ou même essayez d'obtenir sa longueur par programme, comme dans cette démo, vous verrez qu'il est composé de 2 caractères individuels : la lettre minuscule latine o et un accent aigu combiné. De même, chaque bloc de syllabes Hangul (alphabet coréen) peut être précomposé ou écrit comme une combinaison de lettres/caractères individuels jamos distincts.

Pourquoi la combinaison de notes est-elle si importante ? Eh bien, il existe deux manières d'écrire la plupart des caractères avec des signes diacritiques (par exemple à partir des alphabets polonais, hongrois ou tchèque). Cela rend les opérations telles que le tri, la recherche ou la mesure de la longueur du texte non triviales. Habituellement, pour obtenir la meilleure expérience utilisateur, les textes doivent être normalisés (convertis vers l'une des formes normales). Sinon, les utilisateurs risquent d’être confus lorsqu’ils voient, par exemple, plusieurs identifiants « différents » ou noms de fichiers qui se ressemblent. Un bon exemple de ceci est la façon dont Slack gère les noms de chaînes. Ils sont normalisés avant la création de la chaîne, donc les situations dans lesquelles le même nom écrit de différentes manières ne peuvent pas coexister.

Certains personnages sont plus égaux que d'autres

Il existe 2 niveaux d'équivalence de caractères. L'équivalence canonique se produit lorsque les caractères sont supposés avoir la même signification et la même apparence, par ex. les ó et ó susmentionnés ne diffèrent que par la manière (technique) d'écrire. D'un autre côté, la compatibilité signifie que les caractères peuvent apparaître distincts mais peuvent avoir la même signification. Par exemple la ligature ffi est compatible avec trois lettres distinctes ffi mais elles ne sont pas canoniquement égales. Plus d'informations sur la normalisation Unicode peuvent être trouvées dans la documentation standard.

Bien que les formes composées et décomposées pour chacun des 2 niveaux soient standardisées — nous avons donc 4 formes normales au total — la normalisation n'est pas toujours réversible. Par exemple, un signe angström Å est décomposé en la lettre majuscule latine A A plus un anneau combiné au-dessus de ̊, qui sont composés en une lettre majuscule latine A avec un anneau au-dessus de Å, et non en signe angström dont il est issu.

Les bugs de normalisation des combos provoquent des aventures

Il est également important que toutes les applications partageant un texte donné utilisent la même méthode de normalisation. Si ce n’est pas le cas, cela peut provoquer des erreurs subtiles et/ou même des pertes de données silencieuses. De tels bogues peuvent être difficiles à découvrir car chaque application fonctionne parfaitement, du moins lorsqu'elle est exécutée individuellement. Souvent, les applications ne « plantent » pas dans de tels cas, mais envoient ou reçoivent simplement des données différentes de ce qu'elles devraient, entraînant des conséquences inattendues. Un de ces exemples est ce bug dans nettalk.

Les ligatures typographiques susmentionnées sont utilisées pour améliorer l'apparence visuelle de certains caractères qui ne se présentent pas bien séparément les uns par rapport aux autres. La plupart des utilisateurs n'ont pas à se soucier des ligatures, puisqu'elles sont générées automatiquement à partir de lettres individuelles par un logiciel, par ex. TeX produit des ligatures par défaut. Cependant, les développeurs de tels outils doivent tenir compte du fait que, dans certains cas, les ligatures peuvent être inappropriées et introduire des erreurs.

Jetez un oeil à ceci : fi. La deuxième lettre est-elle avec ou sans points ? Les lecteurs turcophones peuvent être confus. Les ligatures contenant i ne doivent pas être utilisées dans certains contextes.

Où est ma majuscule ?

Quelques écritures (dites bicamérales) comme le latin et le grec contiennent des lettres de deux cas. Pratiquement toutes les lettres sont en minuscules et en majuscules. Pratiquement… mais pas absolument tout !
Bien que l'ensemble des minuscules soit toujours présent, ce n'est pas le cas pour les majuscules. Donc, s'il y a des caractères qui n'ont que des minuscules, que se passe-t-il si vous essayez de les convertir en majuscules ? Serait-ce une erreur qui ferait échouer l’opération ? Le personnage resterait-il le même ? La réponse n’est rien de tout cela !

L'un des exemples les plus remarquables est le dièse allemand s — ß. Il s'agit d'un caractère minuscule et, une fois converti en majuscule, il devient double S - SS. Cette transformation n’est pas réversible – SS devient ss. Voyez-le en ligne. TL;DR Unicode 5.1 a introduit ẞ (LETTRE MAJUSCULE LATINE SHARP S) mais elle n'est généralement pas considérée comme une majuscule de ß en termes de mappage de caractères. Il a été récemment (en 2016) ajouté aux règles orthographiques allemandes en tant que forme également valide de SS.

De nombreuses autres ligatures minuscules n'ont pas leurs formes majuscules précomposées correspondantes. La liste complète peut être trouvée dans la documentation Unicode Special Casing.

Les problèmes doubles ou triples

Certains caractères majuscules manquent, et alors ? Les ligatures peuvent être composées de 2 voire 3 caractères, donc le texte en majuscule peut être 3 fois plus long que la minuscule d'origine. Ce fait est extrêmement important lorsque la longueur du texte résultant est limitée. Par exemple, dans les générateurs d'avatars ou d'initiales, comme dans ce bug sur bitrise.io.

Le troisième cas myσteriouς

L'alphabet grec contient la lettre Sigma qui ressemble à ceci en majuscule : Σ. Quelle est sa forme minuscule ? Eh bien, ça dépend ! Habituellement, c'est σ (non final) mais, à la fin des mots, c'est ς (final). Cependant, si un Sigma est la seule lettre ou si le mot est écrit en majuscules, une version non finale est toujours utilisée, même à la position finale. Voir l'exemple interactif.

Encore un autre cas limite

Quelle est la minuscule d'une lettre majuscule latine i avec le tilde Ĩ ? Comme vous l’avez peut-être deviné, la réponse n’est pas si triviale. Une forme minuscule correspondante existe. Les deux formes sont sans points mais c'est parfaitement normal. i et j n'ont pas de points s'ils sont associés à des signes diacritiques. Alors, quel est le problème ici ?

Outre le turc, les règles orthographiques lituaniennes sont également exceptionnelles dans le cas de la lettre I. Dans ce dernier cas, le point est conservé sous l'accent. Cela signifie, par exemple, que le Ĩ susmentionné, lorsqu'il est mis en minuscule dans le contexte de la langue lituanienne, devient i̇̃. Si vous regardez attentivement, vous pouvez voir qu'il y a 3 caractères : une lettre minuscule latine i, un point de combinaison au-dessus et un tilde de combinaison au-dessus. La longueur du texte a augmenté 3 fois (encore).

Continuez à profiter des ligatures et des multigraphes

Comment écrire un mot composé de 7 lettres, en utilisant seulement 6 caractères ? Utilisez simplement des ligatures et des multigraphes précomposés (digraphes, trigraphes, etc.) ! Bien entendu, il n’existe pas de caractère précomposé pour chaque combinaison possible de lettres jointes. Cependant, ceux qui existent déjà peuvent être utilisés pour augmenter efficacement les limites de longueur du texte. Par exemple, un mot silésien dzbonek (un pot) se compose de 7 lettres mais il peut s'écrire dzbonek en utilisant seulement 6 caractères. Voyez-le en ligne. Notez que dz est un digraphe, pas une ligature.

Vous pouvez désormais, par exemple, tweeter des messages contenant plus de 140 caractères ! La liste des digraphes et ligatures Unicode précomposés peut être trouvée ici.

Méthodes peu connues de classement alphabétique

L'ordre alphabétique est généralement enseigné au début de l'école primaire. A, B, C, D… et ainsi de suite jusqu'à Z. Simple comme bonjour !

Malheureusement, l'ordre alphabétique dépend de la langue. Même les positions des lettres latines de base (sans signes diacritiques) peuvent être différentes. Par exemple, en estonien, la lettre Z est entre S et T.

L'emplacement des lettres avec des signes diacritiques n'est pas non plus universel. Il existe plusieurs schémas possibles :

  1. Avant la lettre de base correspondante, comme en maltais : W, X, Ż, Z.

  2. Après la lettre de base correspondante, comme en polonais : A, Ą, B, C, Ć.

  3. À la fin de l'alphabet, comme en suédois : Z, Å, Ä.

  4. À la même position (à des fins de collation) que la lettre de base, comme en hongrois : O=Ó.

Notez que la même lettre peut être rassemblée différemment dans différentes langues et peut même différer dans la même langue, selon le contexte !. Par exemple, en slovaque, un A avec un tréma est toujours situé après A. Cependant, en allemand, il peut soit avoir la même valeur que la version sans tréma, soit être situé après celui-ci, soit même être traité comme A+E. Plus d’informations sur la manière utilisée dans quels cas peuvent être trouvées ici.

Pain, caisse enregistreuse et casino

Ce ne sont pas seulement les lettres individuelles qui sont soumises à une collation. Les multigraphes peuvent également avoir leurs propres règles. En slovaque, CH est collationné entre H et I. Ainsi, par exemple, le mot chlieb (un pain) sera collationné après hodina (une heure). D'un autre côté, en polonais, ce digraphe est traité comme deux lettres distinctes - C et H - et n'a donc pas de règles de collation spéciales. Voir-le en ligne.

Le hongrois a même des doubles digraphes et chacun d'eux a ses propres règles de classement. Cela conduit à de nombreux cas compliqués. Considérons un exemple possible. Nous avons le digraphe SZ. Il est assemblé d'après S. Sa version doublée (SZ + SZ) est un SSZ. Cela signifie que le mot kaszinó (un casino) doit être avant kassza (caisse enregistreuse). Normalement Z est après S mais ici nous avons : K A SZ I dans le premier mot et (un équivalent de) K A SZ SZ dans le second.

De plus, un même groupe de lettres peut être ou non un (double) digraphe selon le contexte. Par exemple, le CH slovaque susmentionné est traité comme 2 lettres distinctes C et H dans certains mots, par ex. viachlas (une polyphonie). Normalement, en hongrois, NNY = NY + NY, comme dans le mot mennybolt (un paradis). Cependant, nous avons aussi un tizennyolc (dix-huit) où NNY = N + NY, il y a donc une seule lettre N et un seul digraphe NY.

ΤНΙЅ ІЅ NОТ WHНΑТ ΥОՍ ТНІNΚ ІТ ΙЅ

Vous pensez peut-être que le titre ci-dessus est constitué uniquement de lettres latines simples. En fait, la grande majorité d’entre elles sont des majuscules grecques, cyrilliques ou arméniennes. Ce ne sont que les homoglyphes de quelques lettres latines.

Donc A (majuscule latin A) n'est pas la même chose que Α (majuscule grec Alpha) ni А (majuscule cyrillique A). Pourquoi est-ce important ? Du fait qu’ils sont impossibles à distinguer, ils peuvent être utilisés dans des attaques d’homographes IDN. Par exemple, le domaine bank.com, ne contenant que des lettres latines, ressemble à peu près à bank.com, contenant le petit A cyrillique au lieu du petit A latin. De tels domaines peuvent être utilisés à des fins de phishing.

Conclure

Gérer du texte peut être délicat dans certains cas, surtout si vous travaillez dans un environnement multilingue. En règle générale, toutes les configurations doivent être adaptées au contexte donné. Par exemple, la langue actuelle de l’utilisateur doit être prise en compte lors du traitement des textes visibles par ces utilisateurs, tandis que les textes lisibles par machine doivent être traités de manière neutre (ou en utilisant l’anglais si cela n’est pas possible). Les paramètres de classement sélectionnés doivent également correspondre à l’utilisation réelle. Le texte doit être normalisé si nécessaire et la méthode de normalisation choisie doit être cohérente dans tout le système.
Vous voulez en savoir plus sur les cas extrêmes ? Restez connectés, la partie 2 est en route !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!