Octets d'une chaîne de caractères en Java
En Java, si j'ai une Chaîne x
, comment puis-je calculer le nombre d'octets dans cette chaîne?
- On pourrait vouloir utiliser une Chaîne de caractères pour représenter le corps de la réponse HTTP et utiliser la taille pour définir le "Content-length" (Longueur d'en-tête, qui est spécifiée en octets/bytes pas de caractères. w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.13
- Une colonne de base de données peut avoir de limitation de la longueur, en octets, par exemple VARCHAR2 (4000 OCTETS) dans Oracle. On peut avoir envie de connaître le nombre d'octets d'une Chaîne de caractères en encodage souhaité savoir si la Chaîne de caractères adaptée.
- Exactement le même que j'essayais de faire.
- Je crois qu'il y a deux interprétations possibles de cette question, en fonction de l'intention: l'Un est "combien de mémoire mon String utiliser?". La réponse à cette question est fournie par @roozbeh ci-dessous (peut-être modulo VM subtilités comme compressé OUPS). L'autre est, "si je convertir la chaîne de caractères à un octet[] combien de mémoire que le tableau d'octets à utiliser?". C'est la question à laquelle il est répondu par Andrzej Doyle. La différence peut être importante: "Hello World" en UTF8 est de 11 octets, mais la Chaîne (par @roozbeh) est de 50 octets (si mon calcul est à droite).
- J'aurais ajouté que le 11 octets ne comprennent pas les frais généraux de l'byte[] de l'objet qui les contient, de sorte que la comparaison est quelque peu trompeur.
Vous devez vous connecter pour publier un commentaire.
Une chaîne est une liste de caractères (c'est à dire les points de code). Le nombre d'octets nécessaires pour représenter la chaîne dépend entièrement de l'encodage que vous utilisez pour le transformer en octets.
Cela dit, vous pouvez transformer la chaîne en un tableau d'octets, puis regarde sa taille comme suit:
Donc, vous voyez, même un simple "ASCII" chaîne peut avoir un nombre différent d'octets dans sa représentation, en fonction de quel encodage est utilisé. Utiliser n'importe quel jeu de caractères qui vous intéresse pour votre cas, en tant qu'argument à
getBytes()
. Et ne pas tomber dans le piège de supposer que l'UTF-8 représente chaque personnage comme un seul octet, comme ce n'est pas vrai non plus:(Notez que si vous ne fournissez pas un jeu de caractères de l'argument, la plate-forme jeu de caractères par défaut est utilisé. Cela peut être utile dans certains contextes, mais en général, vous devriez éviter en fonction des paramètres par défaut, et toujours utiliser explicitement un jeu de caractères lors de l'encodage/décodage est nécessaire.)
getBytes()
, il va utiliser le codage de caractères par défaut de votre système.char
est pas un point de code. Unchar
est de 16 bits (en gros, c'est un unsignedshort
), il prend toujours 2 octets en mémoire. Unint
est nécessaire pour représenter un 4-byte-code, qui est pourquoi les méthodes de comme Chaîne de caractères.codePointAt() de retourint
et paschar
.Si vous êtes en cours d'exécution avec la version 64 bits références:
En d'autres termes:
Sur un 32 bits VM ou 64 bits VM comprimé Oups (-XX:+UseCompressedOops), les références sont de 4 octets. De sorte que le total serait de:
Ceci ne prend pas en compte les références à l'objet de type string.
sizeof
doit être un multiple de 8.Le pédant réponse (mais pas nécessairement la plus utile, en fonction de ce que vous voulez faire avec le résultat) est:
Java, les chaînes de caractères sont stockées physiquement dans
UTF-16BE
codage, qui utilise 2 octets par unité de code, etString.length()
mesures de la longueur de code UTF-16 unités, donc c'est équivalent à:Et cela vous indiquera la taille de l'intérieur de l'
char
tableau, dans octets.Remarque:
"UTF-16"
donnera un résultat différent de"UTF-16BE"
que l'ancien de l'encodage insérer un BOM, l'ajout de 2 octets pour la longueur du tableau.Selon Comment faire pour convertir des Chaînes et de l'UTF8 tableaux d'octets en Java:
s.getBytes(Charset.forName("UTF-8"))
.Un
String
instance alloue une certaine quantité d'octets en mémoire. Peut-être que vous êtes à la recherche de quelque chose commesizeof("Hello World")
qui renvoie le nombre d'octets alloués par le discbased lui-même?En Java, il n'y a généralement pas besoin d'un
sizeof
fonction, parce que nous n'avons jamais allouer de la mémoire pour stocker une structure de données. Nous pouvons avoir un regard sur leString.java
fichier pour une estimation approximative, et nous voyons des "int", des références et unechar[]
. Le Java langage de spécification définit, quechar
varie de 0 à 65535, de sorte que deux octets sont suffisantes pour garder un seul caractère dans la mémoire. Mais une JVM ne pas avoir à stocker un char dans les 2 octets, il n'y a plus de garantir que la mise en œuvre dechar
peuvent contenir des valeurs de l'définit gamme.Donc
sizeof
n'a pas vraiment de sens en Java. Mais, à supposer que nous avons une grande Chaîne et unchar
alloue deux octets, l'empreinte mémoire d'unString
objet est d'au moins2 * str.length()
en octets.Il y a une méthode appelée getBytes(). Utiliser à bon escient .
Essayez ceci :
En supposant que vous avez déclaré et initialisé x avant
Bytes
classe.