ByteBuffer, CharBuffer, String und Charset

Ich versuche zu Sortieren, Charaktere, deren Darstellung in byte-Sequenzen nach Zeichen setzt, und wie die Konvertierung von einem Zeichensatz zu einem anderen in Java. Ich habe einige Schwierigkeiten.

Beispielsweise

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

Mein Verständnis ist, dass:

  • String werden immer gespeichert als UTF-16-byte-Sequenz in Java (2 bytes pro Zeichen, big endian)
  • getBytes() Ergebnis ist das gleiche UTF-16-byte-Sequenz
  • wrap() unterhält diese Sequenz
  • bybf ist daher ein UTF-16 big-endian-Darstellung der Zeichenfolge Olé

So, in diesem code:

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

decode() sollte

  • Interpretieren bybf als UTF-16 string-Darstellung
  • "konvertieren", um es in die ursprüngliche Zeichenfolge Olé.

Eigentlich kein byte sollte geändert werden, da alles in UTF-16 gespeichert und UTF-16 Charset sollte eine Art "Neutrale Netzbetreiber". Das Ergebnis ist jedoch so gedruckt, wie:

??

Wie kann das sein?

Zusätzliche Frage: Für die Umwandlung korrekt, es scheint Charset.decode(ByteBuffer bb) erfordert bb eine UTF-16 big-endian-byte-Reihenfolge Bild von einem string. Ist das richtig?


Bearbeiten: Von den Antworten, vorausgesetzt, ich habe einige Tests zu drucken ByteBuffer Inhalt und die chars die durch Decodierung. Bytes [Codierung mit ="Olé".getBytes(charsetName)] gedruckt werden, die in Erster Linie von Gruppen, die andere Linie(N) sind die Saiten die durch die Dekodierung zurück bytes [mit Charset#decode(ByteBuffer)] mit verschiedenen Charset.

Ich auch bestätigt, dass die Standard-Kodierung für die Speicherung von String in byte[] auf einem Windows 7-computer ist windows-1252 (es sei denn, strings enthalten chars erfordern 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
Schreibe einen Kommentar