Qu'est ce qu'une "paire de substitution" en Java?

Je lisais la documentation pour StringBuffer, en particulier la méthodereverse () . Cette documentation mentionne quelque chose à propos de paires de substitution . Qu'est-ce qu'une paire de substitution dans ce contexte? Et quels sont faible et haut mères porteuses?

118
demandé sur DavidRR 2011-05-05 23:21:58

5 réponses

Le terme "paire de substitution" fait référence à un moyen d'encoder 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 à des valeurs comprises entre 0x0 et 0x10FFFF.

En interne, Java utilise le schéma de codage UTF-16 pour stocker des 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 plage de caractères de 0x0 à 0xFFFF, une certaine complexité supplémentaire est utilisée pour stockez les 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 se trouvent dans deux plages appelées "mères porteuses élevées" et "mères porteuses basses", selon qu'elles sont autorisées au début ou à la fin de la séquence de deux unités de code.

100
répondu Jeffrey L Whitledge 2017-04-19 13:35:23

Les premières versions de Java représentaient des 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 en 16 bits. Plus tard, cependant, Unicode a augmenté la valeur maximale à 1,114,111 (0x10FFFF). Parce que les valeurs de 16 bits étaient trop petites pour représenter tous les caractères Unicode dans Unicode version 3.1, Les valeurs de 32 bits-appelées points de code-ont été adoptées pour le schéma de codage UTF-32. Mais Les valeurs de 16 bits sont préférées aux valeurs de 32 bits pour une utilisation efficace de la mémoire, Unicode a donc introduit une nouvelle conception pour permettre l'utilisation continue des valeurs de 16 bits. Cette conception, adoptée dans le schéma de codage UTF-16, attribue 1 024 valeurs à des substituts élevés de 16 bits(dans la plage U + D800 à U+DBFF) et 1 024 valeurs à des substituts bas de 16 bits(dans la plage U+DC00 à U+DFFF). Il utilise un substitut élevé suivi d'un substitut faible-une paire de substituts - pour représenter (le produit de 1 024 et 1 024)1 048 576 (0x100000) valeurs comprises entre 65 536 (0x10000) et 1 114 111 (0x10FFFF).

23
répondu ibrahem shabban 2017-11-27 07:46:50

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 inversions de chaînes valides. Une paire de substitution (discutée ici) est une paire de valeurs de 16 bits en UTF-16 qui codent un seul point de code Unicode; les substituts bas et haut sont les deux moitiés de ce codage.

22
répondu Jeremiah Willcock 2011-05-05 19:25:24

Les paires de Substitution se réfèrent à la manière D'encoder certains caractères UTF-16, Voir http://en.wikipedia.org/wiki/UTF-16/UCS-2#Code_points_U.2B10000..U.2B10FFFF

5
répondu dfb 2011-05-05 19:23:45

Une paire de substitution est deux "unités de code" en UTF-16 qui constituent un "point de code'. La documentation Java indique que ces "points de code" seront toujours valides, avec leurs "unités de code" ordonnées correctement, après l'inverse. 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 y a une chance que l'inverse de l'inverse ne soit pas le même!

Notez, cependant, le la documentation ne dit rien sur les graphèmes - qui sont plusieurs points de code combinés. Ce qui signifie que e et l'accent qui va avec peut encore être commuté, plaçant ainsi l'accent avant l'E. ce qui signifie que s'il y a une autre voyelle avant l'e, il peut obtenir l'accent qui était sur l'E.

Beurk!

3
répondu Gerard ONeill 2017-06-14 13:44:11