Les octets comptent dans les chaînes UTF-16

Pourquoi la chaîne UTF-16 de 2 caractères ne prend que 6 octets en mémoire, alors que la chaîne UTF-16 de 1 caractère prend 4 octets?

Voici un SSCCE en Java pour démontrer ce comportement:

public class UTF16Test{
    public static void main(String[] args) throws Exception {
        System.out.println("A".getBytes("UTF-16").length);
        System.out.println("AB".getBytes("UTF-16").length);
    }
}

Sortie:

4
6
3
Pour satisfaire ma curiosité, veuillez aussi: `System.out.println (Arrays.toString (" AB ".getBytes (" UTF-16 ")) & zwnj;); ' Merci
ajouté l'auteur rolfl, source
nevermind, je l'ai fait moi-même: [- 2, -1, 0, 65, 0, 66] - oui, byte-order-marks.
ajouté l'auteur rolfl, source

1 Réponses

Vous devez prendre en compte les marques de commande d'octets de 2 octets pour UTF-16?

Vos deux premiers octets seront soit: FE FF ou FF FE selon que vous soyez sur une machine big ou little endian. Vous devriez vérifier ...

Je l'ai fait, et c'est [- 2, -1, 0, 65, 0, 66] .

Vous devriez également considérer que les valeurs de String ne prennent pas cet espace supplémentaire en mémoire, seulement quand la chaîne est codée comme byte [] la marque de byte-order-mark sera ajoutée .... code> AB utilisera char [2] en mémoire jusqu'à ce qu'il soit codé en octets comme octet [6] .

5
ajouté
Mise à jour de certains des detils. Notez le commentaire que les valeurs de byte [] que vous voyez ne sont pas les mêmes que ce qui est stocké dans la mémoire.
ajouté l'auteur rolfl, source