Dans quel encodage est un Java char stockées dans?
Est la Java du type char garanti pour être stockée dans un codage particulier?
Edit: j'ai formulé cette question de manière incorrecte. Ce que je voulais dire est sont char littéraux garanti à utiliser tout de codage particulier?
réponse courte à votre question, est-ce Non, il n'est pas garanti
Oui, il est. La représentation interne est assez bien défini.
non, il n'est pas. De nombreux standard de la bibliothèque Java les classes sont conçues pour fonctionner sur l'hypothèse que les
Qu'en char littéraux? Par exemple, " c " doit avoir une certaine valeur qui est définie par la langue.
Oui, il est. La représentation interne est assez bien défini.
non, il n'est pas. De nombreux standard de la bibliothèque Java les classes sont conçues pour fonctionner sur l'hypothèse que les
char
contient un code Unicode de l'unité, mais l'application peut, en gros, de mettre de 16 bits entier non signé valeur dans une char
. La valeur n'est pas nécessaire d'être codé d'une manière particulière. Il n'a même pas besoin de représenter une complète (ou partielle) de "caractère".Qu'en char littéraux? Par exemple, " c " doit avoir une certaine valeur qui est définie par la langue.
OriginalL'auteur pepsi | 2011-08-11
Vous devez vous connecter pour publier un commentaire.
"Stockés" où? Toutes les Chaînes de caractères en Java sont représenté en UTF-16. Lorsqu'il est écrit dans un fichier, envoyé sur un réseau, ou tout autre chose, il est envoyé à l'aide de quelque encodage de caractères que vous spécifiez.
Edit: Spécifiquement pour le
char
type, voir l' Caractère docs. Plus précisément: "Le type de données char ... sont fondées sur l'original de la spécification Unicode, qui définit les caractères à largeur fixe 16 bits entités." Par conséquent, le castingchar
àint
toujours de vous donner un UTF-16 valeur si lachar
contient en fait un personnage à partir de ce jeu de caractères. Si vous venez de piquer quelques valeur aléatoire dans lechar
, il est évident qu'elle ne sera pas forcément valable caractère UTF-16, et de même, si vous lisez le personnage à l'aide d'un mauvais encodage. Les docs aller sur pour discuter de la façon dont le complémentaire de l'UTF-16 caractères ne peut être représenté que par unint
, depuischar
n'ont pas assez d'espace pour les tenir, et si vous êtes d'exploitation à ce niveau, il peut être important de se familiariser avec ceux de la sémantique.Mise à jour de ma réponse
Parfait, ce lien est exactement ce que je cherchais. Merci!
OriginalL'auteur Ryan Stewart
Java
char
est classiquement utilisé pour tenir une Code Unicode unité; c'est à dire un 16 bits unité qui fait partie d'un valide UTF-16 séquence. Cependant, il n'y a rien pour empêcher une application de mettre n'importe quel 16 bits non signé valeur dans unechar
, indépendamment de ce que cela signifie réellement.Alors on peut dire qu'un code Unicode unité peut être représenté par un
char
et unchar
peut représentent un code Unicode de l'unité ... mais aucune de ces options n'est nécessairement vrai, dans le cas général.Votre question sur la façon dont Java
char
est stockée ne peut pas être répondu. Simplement dit, cela dépend de ce que tu veux dire par "stockés":Si vous voulez dire "représenté dans un programme en cours d'exécution", alors la réponse est la JVM de mise en œuvre spécifiques. (Le
char
type de données est généralement représenté comme un 16 bits entier machine, même s'il peut ou peut ne pas être une machine à mot aligné, en fonction du contexte spécifique.)Si vous voulez dire "stockées dans un fichier" ou quelque chose comme ça, alors la réponse est entièrement dépendante sur la façon dont l'application choisit de les stocker.
À la lumière de ce que j'ai dit ci-dessus, la réponse est "Non". Dans une exécution de l'application, c'est à la demande de définir ce qu'est un
char
moyens /contient. Lorsqu'unchar
est stocké dans un fichier, l'application décide comment il veut store il et ce sur disque représentation.SUIVI
Tout dépend du caractère littéral de la forme, et ce que le personnage est. Par exemple, " c "aura la valeur de la 16 bits inférieurs de l'Unicode codepoint pour la minuscule "c". Mais un littéral exprimé en tant que '\uxxxx' peut pas représenter une Unicode valide codepoint. Ou (selon l'application), il peut ne pas représenter un caractère à tous.
C'est aussi (peut-être) compliquée par l'encodage du fichier de code source. Il est théoriquement possible de représenter votre code source dans le caractère personnalisé de l'encodage dans lequel (pour la clarté de l'exposé) des lettres majuscules sont codées comme des minuscules, et vice versa. Si vous avez fait cela, et que vous avez été en mesure d'enregistrer le jeu de caractères correspondant de l'encodeur et du décodeur avant de lancer le compilateur, puis un littéral qui ressemble
'c'
(visualisation de l'entrée ASCII ou UTF-8) aurait en fait la valeur67
dans le compilateur programme plutôt que de99
.Certaines valeurs dans la plage de 0-65535 sont définies par Unicode spec pour ne pas être valide les points de code. 65535 est un exemple qui est illégal - un "non-personnage". D'autres sont "non assigné". Reportez-vous à unicode.org/versions/Unicode6.0.0/ch16.pdf pour plus de détails.
Tous les nombres entiers dans la gamme 0-65535 sont valables points de code.
non, ils ne le sont pas. Lire le document que j'ai lié.
Chapitre 16 stipule explicitement que U+FFFF est un point de code (“La dernière deux les points de code de chaque plan sont noncharacters: U+FFFE et U+FFFF sur le BMP”); vous semblez confondre “point de code” avec “point de code, qui est attribué à un personnage abstrait” ou “caractère”. La définition de “point de code” (chapitre 2, D9 et D10) est tout à fait clair: Tout entier compris dans la plage 0–0x10FFFF est un point de code.
OriginalL'auteur Stephen C
À l'origine, Java utilisé UCS-2 à l'interne; maintenant, il utilise l'UTF-16. Les deux sont presque identiques, sauf pour le D800 - DFFF, qui sont utilisés dans le codage UTF-16 dans le cadre de l'extension de la représentation des caractères plus gros.
OriginalL'auteur Ernest Friedman-Hill