2014-01-07 9 views
12

Ich habe versucht, Zeichencodierung in Java zu verstehen. Zeichen in Java werden in 16 Bits mit UTF-16-Codierung gespeichert. Also, während ich einen String mit 6 Zeichen in Byte umwandle, bekomme ich 6 Bytes wie unten, ich erwarte, dass es 12 ist. Gibt es irgendein Konzept, das ich vermisse?UTF-16 Zeichencodierung von Java

package learn.java; 

public class CharacterTest { 

    public static void main(String[] args) { 
     String str = "Hadoop"; 
     byte bt[] = str.getBytes(); 
     System.out.println("the length of character array is " + bt.length); 
    } 
} 

O/P: die Länge des Zeichenfeldes 6

Wie pro @Darshan Wenn mit UTF-16-Codierung versuchen Bytes zu erhalten das Ergebnis ist auch nicht zu erwarten.

package learn.java; 

    public class CharacterTest { 

     public static void main(String[] args) { 

      String str = "Hadoop"; 
      try{ 
       byte bt[] = str.getBytes("UTF-16"); 
       System.out.println("the length of character array is " + bt.length); 

      } 
      catch(Exception e) 
      { 

      } 
     } 
    } 

o/p: the length of character array is 14 
+0

'str.getBytes (" UTF-16 ");' aber ich bin wunder o/p ist 14 –

+1

ja Darshan, gleich hier. Es sollte 12 richtig sein !!! – priyaranjan

+7

Ja für die Sie verwenden, um 'utf-16le' oder' utf-16be' bitte refere folgende [link] http://rosettacode.org/wiki/String_length für weitere Details. –

Antwort

9

In der UTF-16-Version erhalten Sie 14 Bytes, weil ein Marker eingefügt wurde, um zwischen Big Endian (Standard) und Little Endian zu unterscheiden. Wenn Sie UTF-16LE angeben, erhalten Sie 12 Byte (Little-Endian, keine Byte-Reihenfolge-Markierung hinzugefügt).

Siehe http://www.unicode.org/faq/utf_bom.html#gen7


EDIT - Verwenden Sie dieses Programm in das tatsächliche Bytes von verschiedenen Codierungen erzeugt aussehen:

public class Test { 
    public static void main(String args[]) throws Exception { 
     // bytes in the first argument, encoded using second argument 
     byte[] bs = args[0].getBytes(args[1]); 
     System.err.println(bs.length + " bytes:"); 

     // print hex values of bytes and (if printable), the char itself 
     char[] hex = "ABCDEF".toCharArray(); 
     for (int i=0; i<bs.length; i++) { 
      int b = (bs[i] < 0) ? bs[i] + 256 : bs[i]; 
      System.err.print(hex[b>>4] + "" + hex[b&0xf] 
       + (! Character.isISOControl((char)b) ? ""+(char)b : ".") 
       + ((i%4 == 3) ? "\n" : " ")); 
     } 
     System.err.println(); 
    } 
} 

Zum Beispiel beim Laufen unter UTF-8 (unter anderen JVM Standardcodierungen, würden die Zeichen für FE und FF zeigen unterschiedliche), die Ausgabe ist:

$ javac Test.java && java -cp . Test hello UTF-16 
12 bytes: 
FEþ FFÿ 00. 68h 
00. 65e 00. 6Cl 
00. 6Cl 00. 6Fo 

Und

$ javac Test.java && java -cp . Test hello UTF-16LE 
10 bytes: 
60h 00. 65e 00. 
64l 00. 64l 00. 
67o 00. 
+2

Ich bin verwirrt, sollte nicht die Stückliste FE FF sein? Warum ist es 76 ~ 77. in Ihrem Ausdruck? – Roland

+0

Danke für die Entdeckung, Roland - mehrere kleine Tippfehler arbeiteten zusammen, um eine sehr falsche Hex-Ausgabe zu erzeugen. – tucuxi

1

String.getBytes() verwendet Standard Plattform Codierung. Versuchen Sie, diese

byte bt[] = str.getBytes("UTF-16"); 
2

Gemäß den String.getBytes() method's documentation, wird die Zeichenfolge in eine Sequenz von Bytes, codiert unter Verwendung der Standard-Zeichensatzes der Plattform.

Ich nehme an, Ihr Plattform-Standard-Zeichensatz wird ISO-8859-1 sein (oder ein ähnlicher Ein-Byte-pro-Char-Zeichensatz). Diese Zeichensätze codieren ein Zeichen in ein Byte. Wenn Sie die Codierung angeben möchten, verwenden Sie die Methode String.getBytes(Charset) oder String.getBytes(String).

Über die 16-Bit-Speicherung: So speichert Java intern Zeichen, also auch Zeichenfolgen. Es basiert auf der ursprünglichen Unicode-Spezifikation.