web-dev-qa-db-fra.com

Quel est le codage de caractères de String en Java?

Je suis en fait confus concernant l'encodage des chaînes en Java. J'ai quelques questions. S'il vous plaît, aidez-moi si vous connaissez la réponse:

1) Quel est le codage natif des chaînes Java en mémoire? Lorsque j'écris String a = "Hello" dans quel format sera-t-il stocké? Puisque Java est indépendant de la machine, je ne pense pas que le système fera l'encodage.

2) J'ai lu sur le net que "UTF-16" est l'encodage par défaut mais je me suis trompé car dis quand j'écris ça int a = 'c' J'obtiens le numéro du caractère dans la table ASCII. Ainsi ASCII et UTF-16 sont-ils les mêmes?)

3) Je ne savais pas non plus de quoi dépend le stockage d'une chaîne dans la mémoire: OS, langue?

45
user506710

1) Les chaînes sont des objets, qui contiennent généralement un tableau char et la longueur des chaînes. Le tableau de caractères est généralement implémenté comme un tableau contigu de mots de 16 bits, chacun contenant un caractère Unicode dans l'ordre des octets natifs.

2) L'attribution d'une valeur de caractère à un entier convertit le code de caractère Unicode 16 bits en son équivalent entier. Ainsi 'c', qui est U + 0063, devient 0x0063 ou 99.

3) Étant donné que chaque String est un objet, il contient d'autres informations que ses membres de classe (par exemple, le descripteur de classe Word, le mot de verrouillage/sémaphore, etc.).

[~ # ~] adendum [~ # ~]
Le contenu de l'objet dépend de l'implémentation JVM (qui détermine la surcharge inhérente associée à chaque objet) et de la façon dont la classe est réellement codée (c'est-à-dire que certaines bibliothèques peuvent être plus efficaces que d'autres).

[~ # ~] exemple [~ # ~]
Une implémentation typique allouera une surcharge de deux mots par instance d'objet (pour le descripteur/pointeur de classe et un mot de contrôle de sémaphore/verrouillage); un objet String contient également une longueur int et un char[] référence de tableau. Le contenu réel des caractères de la chaîne est stocké dans un deuxième objet, le char[] tableau, qui à son tour se voit attribuer deux mots, plus une longueur de tableau Word, plus autant d'éléments char 16 bits que nécessaire pour la chaîne (plus tous les caractères supplémentaires qui restaient suspendus lorsque la chaîne était établi).

ADDENDA 2
Le cas où un char représente un Le caractère Unicode n'est vrai que dans la plupart des cas. Cela impliquerait CS-2 encodage et vrai avant 2005. Mais maintenant Unicode est devenu plus grand et les chaînes doivent être encodées en utilisant UTF-16 - où hélas un seul caractère Unicode peut utiliser deuxchars dans un Java String.

Jetez un œil au code source réel pour l'implémentation d'Apache, par exemple à:
http://www.docjar.com/html/api/Java/lang/String.Java.html

20
David R Tribble
  1. Java stocke les chaînes au format UTF-16 en interne.

  2. "encodage par défaut" n'est pas tout à fait correct. Java stocke les chaînes en UTF-16 en interne, mais l'encodage utilisé en externe, "l'encodage par défaut du système", varie d'une plateforme à l'autre, et peut même être modifié par des choses comme les variables d'environnement sur certaines plateformes .

    ASCII est un sous-ensemble de Latin 1 qui est un sous-ensemble de Unicode. UTF-16 est un moyen de coder Unicode. Donc, si vous effectuez votre int i = 'x' testez tout caractère compris dans la plage ASCII vous obtiendrez la valeur ASCII. L'UTF-16 peut représenter beaucoup plus de caractères que l'ASCII, toutefois.

  3. À partir des documents Java.lang.Character :

    La plateforme Java 2 utilise la représentation UTF-16 dans les tableaux de caractères et dans les classes String et StringBuffer.

    Il est donc défini comme faisant partie de la plate-forme Java 2 que UTF-16 est utilisé pour ces classes.

37
Laurence Gonsalves

Bien que cela ne réponde pas à votre question, il convient de noter que ... Dans le code Java octet (fichier de classe), la chaîne est stockée en UTF-8. http : //Java.Sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

4
Ralph

Edit: merci à LoadMaster de m'avoir aidé à corriger ma réponse:)

1) Tout le traitement de chaîne interne est effectué en UTF-16.

2) ASCII est un sous-ensemble de UTF-16.

3) En interne en Java est UTF-16. Pour le reste, cela dépend de l'endroit où vous êtes, oui.

1
LaGrandMere