web-dev-qa-db-fra.com

Quelle est la représentation interne de Java pour String? UTF-8 modifié? UTF-16?

J'ai recherché la représentation interne de Java pour String, mais j'ai deux matériaux qui semblent fiables mais incohérents.

L'un est:

http://www.codeguru.com/cpp/misc/misc/multi-lingualsupport/article.php/c10451

et ça dit:

Java utilise UTF-16 pour la représentation de texte interne et prend en charge une modification non standard d'UTF-8 pour la sérialisation de chaînes.

L'autre est:

http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8

et ça dit:

Tcl utilise également le même UTF-8 [25] modifié que Java pour la représentation interne des données Unicode, mais utilise le CESU-8 strict pour les données externes.

UTF-8 modifié? Ou UTF-16? Laquelle est correcte? Et combien d'octets Java utilise-t-il pour un caractère en mémoire?

Veuillez me faire savoir lequel est correct et combien d'octets il utilise.

46
Johnny Lim

Java utilise UTF-16 pour la représentation de texte interne

La représentation de String et StringBuilder etc dans Java est UTF-16

https://docs.Oracle.com/javase/8/docs/technotes/guides/intl/overview.html

Comment le texte est-il représenté dans la plate-forme Java?

Le langage de programmation Java est basé sur le jeu de caractères Unicode et plusieurs bibliothèques implémentent la norme Unicode. Le type de données primitif char dans le langage de programmation Java est un entier 16 bits non signé pouvant représenter un point de code Unicode compris entre U + 0000 et U + FFFF, ou les unités de code UTF-16. Les différents types et classes de la plateforme Java Java qui représentent des séquences de caractères - char [], des implémentations de Java.lang.CharSequence (telles que la classe String) et des implémentations de Java.text.CharacterIterator - sont des séquences UTF-16.

Au niveau de la JVM, si vous utilisez -XX:+UseCompressedStrings (qui est par défaut pour certaines mises à jour de Java 6) La représentation réelle en mémoire peut être 8 bits, ISO-8859-1 mais uniquement pour les chaînes qui n'ont pas besoin d'UTF-16 codage.

http://www.Oracle.com/technetwork/Java/javase/tech/vmoptions-jsp-140102.html

et prend en charge une modification non standard d'UTF-8 pour la sérialisation de chaînes.

Les chaînes sérialisées utilisent UTF-8 par défaut.

Et combien d'octets Java utilise-t-il pour un caractère en mémoire?

Un char est toujours de deux octets, si vous ignorez la nécessité d'un remplissage dans un objet.

Remarque: un point de code (qui autorise un caractère> 65535) peut utiliser un ou deux caractères, soit 2 ou 4 octets.

58
Peter Lawrey

Avant Java 9 , la représentation standard en mémoire d'un Java String correspond aux unités de code UTF-16 contenues dans un char[]. L'UTF-8 modifié est utilisé dans d'autres contextes; par exemple. dans les fichiers ".class" et le format de sérialisation de l'objet.

Vous pouvez le confirmer en consultant le code source du Java.lang.String classe.

Avec Java 6 mise à jour 21 et versions ultérieures, il y avait une option non standard (-XX:UseCompressedStrings) pour activer les chaînes compressées. Cette fonctionnalité a été supprimée dans Java 7.

Pour Java 9 et versions ultérieures , le comportement si String a été modifié pour utiliser une représentation compacte pour les chaînes par défaut. La commande Javadocumentation dit maintenant ceci:

-XX: -CompactStrings

Désactive la fonction Compact Strings. Par défaut, cette option est activée. Lorsque cette option est activée, Java Les chaînes contenant uniquement des caractères à un octet sont représentés et stockés en interne sous forme de chaînes d'un octet par caractère à l'aide du codage ISO-8859-1/Latin-1. Cela réduit de 50% l'espace requis pour les chaînes contenant uniquement des caractères d'un octet. Pour Java Chaînes contenant au moins un caractère multi-octets: ceux-ci sont représentés et stockés sous la forme de 2 octets par caractère à l'aide du codage UTF-16. La désactivation de la fonction de chaînes compactes force l'utilisation du codage UTF-16 comme représentation interne pour tous Java Chaînes.

Notez qu'aucune chaîne "compressée" ou "compacte" n'utilise/n'utilise l'encodage UTF-8.

Voir également:

18
Stephen C

UTF-16.

De http://Java.Sun.com/javase/technologies/core/basic/intl/faq.jsp :

Comment le texte est-il représenté dans la plate-forme Java?

Le langage de programmation Java est basé sur le jeu de caractères Unicode et plusieurs bibliothèques implémentent la norme Unicode. Le type de données primitif char dans le langage de programmation Java est un entier 16 bits non signé pouvant représenter un point de code Unicode compris entre U + 0000 et U + FFFF, ou les unités de code UTF-16. Les différents types et classes de la plateforme Java Java qui représentent des séquences de caractères - char [], des implémentations de Java.lang.CharSequence (telles que la classe String) et des implémentations de Java.text.CharacterIterator - sont des séquences UTF-16.

12
Andreas Johansson

La taille d'un char est de 2 octets.

Par conséquent, je dirais que Java utilise UTF-16 pour la représentation de chaîne interne.

3
belgther