Qu’est-ce qu’une “paire de substitution” en Java?

Je lisais la documentation de SsortingngBuffer , en particulier la méthode reverse () . Cette documentation mentionne quelque chose à propos des paires de substitution . Qu’est-ce qu’une paire de substitution dans ce contexte? Et quels sont les substituts bas et haut ?

Le terme “paire de substitution” fait référence à un moyen de coder des caractères Unicode avec des points de code élevés dans le schéma de codage UTF-16.

Dans le codage de caractères Unicode, les caractères sont mappés sur des valeurs comsockets entre 0x0 et 0x10FFFF.

En interne, Java utilise le schéma de codage UTF-16 pour stocker les chaînes de texte Unicode. En UTF-16, des unités de code de 16 bits (deux octets) sont utilisées. Puisque 16 bits ne peuvent contenir que la gamme de caractères de 0x0 à 0xFFFF, une complexité supplémentaire est utilisée pour stocker des valeurs au-dessus de cette plage (0x10000 à 0x10FFFF). Ceci est fait en utilisant des paires d’unités de code connues sous le nom de substituts.

Les unités de code de substitution sont réparties en deux gammes appelées «substituts élevés» et «substituts bas», selon qu’elles sont autorisées au début ou à la fin de la séquence à deux unités de code.

Ce que cette documentation dit, c’est que les chaînes UTF-16 non valides peuvent devenir valides après avoir appelé la méthode reverse car elles peuvent être les renversements de chaînes valides. Une paire de substitution (décrite ici ) est une paire de valeurs 16 bits dans UTF-16 qui codent un seul sharepoint code Unicode; les substituts bas et haut sont les deux moitiés de cet encodage.

Les premières versions de Java représentaient les caractères Unicode utilisant le type de données char à 16 bits. Cette conception était logique à l’époque, car tous les caractères Unicode avaient des valeurs inférieures à 65 535 (0xFFFF) et pouvaient être représentés sur 16 bits. Plus tard, cependant, Unicode a augmenté la valeur maximale à 1.114.111 (0x10FFFF). Les valeurs 16 bits étant trop petites pour représenter tous les caractères Unicode dans Unicode version 3.1, les valeurs 32 bits – appelées points de code – ont été adoptées pour le schéma de codage UTF-32. Mais les valeurs 16 bits sont préférables aux valeurs 32 bits pour une utilisation efficace de la mémoire. Unicode a donc introduit une nouvelle conception pour permettre l’utilisation continue de valeurs 16 bits. Cette conception, adoptée dans le schéma de codage UTF-16, atsortingbue 1 024 valeurs à des substituts de 16 bits (dans la plage U + D800 à U + DBFF) et 1 024 autres valeurs à des substituts de 16 bits (dans la plage U + DC00) à U + DFFF). Il utilise un substitut élevé suivi par un substitut bas – une paire de substitution – pour représenter (le produit de 1 024 et 1 024) 1 048 576 (0x100000) valeurs entre 65 536 (0x10000) et 1 114 111 (0x10FFFF).

Les paires de substituts font référence à la manière dont UTF-16 encodait certains caractères, voir http://en.wikipedia.org/wiki/UTF-16/UCS-2#Code_points_U.2B10000..U.2B10FFFF

Une paire de substitution est constituée de deux «unités de code» dans UTF-16 qui constituent un «sharepoint code». La documentation Java indique que ces «points de code» seront toujours valides, avec leurs «unités de code» correctement ordonnées, après l’inversion. Il indique en outre que deux unités de code de substitution non appariées peuvent être inversées et former une paire de substitution valide. Ce qui signifie que s’il y a des unités de code non appariées, il est possible que l’inverse de l’inverse ne soit pas le même!

Notez, cependant, que la documentation ne dit rien à propos de Graphemes – plusieurs points de code combinés. Ce qui signifie que e et l’accent qui l’accompagne peuvent encore être changés, plaçant ainsi l’accent avant le e. Ce qui signifie que s’il y a une autre voyelle avant le e, il peut avoir l’accent qui était sur le e.

Yikes!