web-dev-qa-db-fra.com

Java - quels sont les caractères, les points de code et les substituts? Quelle différence y a-t-il entre eux?

J'essaie de trouver une explication des termes "caractère", "point de code" et "substitut", et bien que ces termes ne soient pas limités à Java, s'il y a des différences spécifiques au langage, j'aimerais que l'explication soit cela concerne Java.

J'ai trouvé des informations sur les différences entre les caractères et les points de code, les caractères étant ce qui est affiché pour les utilisateurs humains, et les points de code étant une valeur codant ce caractère spécifique, mais je n'ai aucune idée des substituts. Que sont les substituts et en quoi diffèrent-ils des caractères et des points de code? Ai-je les bonnes définitions pour les caractères et les points de code?

Dans n autre fil sur le fait de parcourir une chaîne en tant que tableau de caractères, le commentaire spécifique qui a suscité cette question était "Notez que cette technique vous donne des caractères, pas des points de code, ce qui signifie que vous pouvez obtenir des substituts." Je n'ai pas vraiment compris, et plutôt que de créer une longue série de commentaires sur une question de 5 ans, j'ai pensé qu'il serait préférable de demander des éclaircissements dans une nouvelle question.

29
Alium Britt

Pour représenter du texte dans des ordinateurs, vous devez résoudre deux choses: d'abord, vous devez mapper des symboles à des nombres, puis, vous devez représenter une séquence de ces nombres avec des octets.

Un point de code est un nombre qui identifie un symbole. ASCII et Unicode. ASCII définit 128 symboles. Unicode définit actuellement 109384 symboles, soit bien plus de 2).16.

En outre, ASCII spécifie que les séquences de nombres sont représentées un octet par nombre, tandis que Unicode spécifie plusieurs possibilités, telles que UTF-8, UTF-16 et UTF-32.

Lorsque vous essayez d'utiliser un codage qui utilise moins de bits par caractère que nécessaire pour représenter toutes les valeurs possibles (comme UTF-16, qui utilise 16 bits), vous avez besoin d'une solution de contournement.

Ainsi, Surrogates sont des valeurs de 16 bits qui indiquent des symboles qui ne tiennent pas dans une seule valeur de deux octets.

Java utilise UTF-16.

En particulier, un char (caractère) est une valeur à deux octets non signée qui contient une valeur UTF-16.

Si vous voulez en savoir plus sur Java et Unicode, je peux recommander cette newsletter: Partie 1 , Partie 2

23
Cephalopod

Vous pouvez trouver une brève explication dans le Javadoc pour la classe Java.lang.Character :

Représentations des caractères Unicode

Le type de données char (et donc la valeur qu'un objet Character encapsule) est basé sur la spécification Unicode d'origine, qui définissait les caractères comme des entités 16 bits de largeur fixe. La norme Unicode a depuis été modifiée pour autoriser les caractères dont la représentation nécessite plus de 16 bits. La plage de points juridiques points de code est désormais U+0000 à U+10FFFF, appelé Valeur scalaire Unicode. [..]

L'ensemble de caractères de U+0000 à U+FFFF est parfois appelé Plan multilingue de base (BMP). Caractères dont les points de code sont supérieurs à U+FFFF sont appelés caractères supplémentaires. La plate-forme Java utilise la représentation UTF-16 dans les tableaux char et dans les classes String et StringBuffer. Dans cette représentation, des caractères supplémentaires sont représentées par une paire de valeurs char, la première de la plage sur-substituts, (\ uD800-\uDBFF), la seconde de low- substituts plage (\ uDC00-\uDFFF).

En d'autres termes:

Un point de code représente généralement un seul caractère. À l'origine, les valeurs de type char correspondaient exactement aux points de code Unicode. Cet encodage était également connu sous le nom de CS-2 .

Pour cette raison, char a été défini comme un type 16 bits. Cependant, il y a actuellement plus de 2 ^ 16 caractères en Unicode. Pour prendre en charge l'ensemble jeu de caractères, le codage a été modifié du codage de longueur fixe CS-2 au codage de longueur variable TF-16 . Dans ce codage, chaque point de code est représenté par un seul char ou par deux char. Dans ce dernier cas, les deux caractères sont appelés paire de substitution.

UTF-16 a été défini de telle manière qu'il n'y a pas de différence entre le texte codé avec UTF-16 et UCS-2, si tous les points de code sont inférieurs à 2 ^ 14. Cela signifie que char peut être utilisé pour représenter certains mais pas tous caractères. Si un caractère ne peut pas être représenté dans un seul char, le terme char est trompeur, car il est simplement utilisé comme mot 16 bits.

14
nosid

Les points de code se réfèrent généralement aux points de code Unicode. Le glossaire Unicode dit ceci:

Codepoint (1) : Toute valeur dans l'espace de code Unicode; c'est-à-dire la plage d'entiers de 0 à 10FFFF16.

En Java, un caractère (char) est une valeur non signée de 16 bits; soit 0 à FFFF.

Comme vous pouvez le voir, il y a plus de points de code Unicode qui peuvent être représentés par des caractères Java. Et pourtant Java doit pouvoir représenter du texte en utilisant tous les Unicode valides). codepoints.

La manière dont Java traite cela est de représenter les points de code qui sont plus grands que FFFF sous la forme d'une paire de caractères (code unités); c'est-à-dire un paire de substitution . Ces codent un point de code Unicode qui est plus grand que FFFF comme une paire de valeurs de 16 bits Cela utilise le fait qu'une sous-gamme de l'espace de code Unicode (c'est-à-dire D800 à U + DFFF) est réservée pour représenter les paires de substitution. Les détails techniques sont ici .


Le terme approprié pour l'encodage utilisé par Java est le TF-16 Encoding Form .

Un autre terme que vous pourriez voir est nité de code qui est l'unité de représentation minimale utilisée dans un codage particulier. En UTF-16, l'unité de code est de 16 bits, ce qui correspond à un Java char. D'autres codages (par exemple UTF-8, ISO 8859-1, etc.) ont 8 bits unités de code, et UTF-32 a une unité de code 32 bits.


Le terme caractère a de nombreuses significations. Cela signifie toutes sortes de choses dans différents contextes. Le glossaire Unicode donne 4 significations pour caractère comme suit:

Personnage. (1) La plus petite composante du langage écrit qui a une valeur sémantique; fait référence à la signification et/ou à la forme abstraite, plutôt qu’à une forme spécifique (voir aussi glyphe), bien que dans les tableaux de codes une certaine forme de représentation visuelle soit essentielle pour la compréhension du lecteur.

Personnage. (2) Synonyme de caractère abstrait. ( Caractère abstrait . Unité d'information utilisée pour l'organisation, le contrôle ou la représentation des données textuelles.)

Personnage. (3) L'unité de base de codage pour le codage de caractères Unicode.

Personnage. (4) Nom anglais des éléments écrits idéographiques d'origine chinoise. [Voir idéogramme (2).]

Et puis il y a la Java signification spécifique pour le caractère.

7
Stephen C

Pour commencer, l'unicode est une norme qui essaie de définir et de mapper tous les caractères individuels de toutes les langues, des lettres anglaises au chinois, aux chiffres, aux symboles, etc.

Fondamentalement, l'unicode a une longue liste de caractères numérotés où le point de code fait référence à la numérotation.

En bref

  • Les caractères sont les jetons individuels d'un texte, qu'il s'agisse d'une lettre, d'un chiffre ou d'un symbole.
  • Un point de code fait référence à la numérotation d'un jeton dans la norme unicode
  • Caractères représentés à l'aide du UTF-16 le schéma de codage contient tellement de caractères que tous ne rentrent pas dans l'espace désigné d'un seul caractère Java.
  • Paires de substitution est le terme utilisé pour dire qu'un caractère doit être représenté dans l'espace d'une paire de caractères. Paires de substitution est le terme utilisé pour dire qu'un caractère est répertorié si haut dans la table unicode qu'il a besoin d'une paire d'espaces de caractères pour le représenter.
5
Johan Sjöberg