ByteBuffer, CharBuffer, et le jeu de caractères de la Chaîne

Je suis en train de faire le tri des personnages, de leur représentation dans les séquences d'octets selon les jeux de caractères, et la façon de convertir à partir d'un jeu de caractères à un autre en Java. J'ai quelques difficultés.

Par exemple,

ByteBuffer bybf = ByteBuffer.wrap("Olé".getBytes());

Ma compréhension est que:

  • Chaîne sont toujours stockées en tant que UTF-16 séquence d'octets en Java (2 octets par caractère, big endian)
  • getBytes() résultat est le même UTF-16 séquence d'octets
  • wrap() maintient cette séquence
  • bybf est donc un UTF-16 big endian représentation de la chaîne de Olé

Donc dans ce code:

Charset utf16 = Charset.forName("UTF-16");  
CharBuffer chbf = utf16.decode(bybf);  
System.out.println(chbf);  

decode() devrait

  • Interpréter bybf comme UTF-16 représentation de chaîne
  • "convertir" à la chaîne d'origine Olé.

Fait pas d'octet doit être modifié depuis tout est en UTF-16 stockées et UTF-16 Charset devrait être une sorte de "neutre" d'opérateur. Cependant, le résultat est imprimé en tant que:

??

Comment peut-il être?

Question supplémentaire: Pour convertir correctement, il semble Charset.decode(ByteBuffer bb) nécessite bb être un UTF-16 big endian séquence d'octets de l'image d'une chaîne. Est-ce exact?


Modifier: à Partir des réponses fournies, j'ai fait quelques tests pour imprimer un ByteBuffer contenu et la chars obtenu par décodage. Octets [encodage ="Olé".getBytes(charsetName)] sont imprimés sur la première ligne de groupes, l'autre ligne(s) sont les chaînes obtenues par le décodage arrière les octets [avec Charset#decode(ByteBuffer)] avec divers Charset.

J'ai aussi confirmé que le codage par défaut pour le stockage de la Chaîne byte[] sur un ordinateur Windows 7 est windows-1252 (à moins contiennent des chaînes de caractères nécessitant UTF-8).

Default VM encoding: windows-1252  
Sample string: "Olé"  


  getBytes() no CS provided : 79 108 233  <-- default (windows-1252), 1 byte per char
     Decoded as windows-1252: Olé         <-- using the same CS than getBytes()
           Decoded as UTF-16: ??          <-- using another CS (doesn't work indeed)

  getBytes with windows-1252: 79 108 233  <-- same than getBytes()
     Decoded as windows-1252: Olé

         getBytes with UTF-8: 79 108 195 169  <-- 'é' in UTF-8 use 2 bytes
            Decoded as UTF-8: Olé

        getBytes with UTF-16: 254 255 0 79 0 108 0 233 <-- each char uses 2 bytes with UTF-16
           Decoded as UTF-16: Olé                          (254-255 is an encoding tag)
InformationsquelleAutor mins | 2014-06-29