2014-01-07 18 views
12

Javaの文字エンコーディングを理解しようとしていました。 Javaの文字は、UTF-16エンコーディングを使用して16ビットで格納されます。だから私は6文字を含む文字列をバイトに変換している間に、私は以下のように6バイトを取得しています。私はそれが12であることを期待しています。JavaのUTF-16文字エンコーディング

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は:結果も期待されていないバイトを取得するために、UTF-16エンコーディングをしようとすると、文字列の長さは@Darshan 1として6

です。

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 ");' しかし、私はwonder/oは14です。 –

+1

はいDarshan、ここと同じです。それは12でなければならない! – priyaranjan

+7

はい、あなたは 'utf-16le'または' utf-16be'を使用する必要があります 詳細については、次の[link] http://rosettacode.org/wiki/String_lengthを参考にしてください。 –

答えて

9

UTF-16バージョンでは、ビッグエンディアン(デフォルト)とリトルエンディアンを区別するためにマーカーが挿入されているため、14バイトを取得します。 UTF-16LEを指定すると、12バイトが得られます(リトルエンディアン、バイトオーダーマーカーは追加されません)。

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


EDITを参照してください - 異なるエンコーディングによって生成された実際のバイトに見て使用このプログラム例:

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(); 
    } 
} 

、他の下でUTF-8(下で実行されていますJVMのデフォルトのエンコーディング、FEとFFの文字が異なって表示される)、出力は次のようになります。

$ javac Test.java && java -cp . Test hello UTF-16 
12 bytes: 
FEþ FFÿ 00. 68h 
00. 65e 00. 6Cl 
00. 6Cl 00. 6Fo 
UTF-16エンコーディング使用 str.getBytes("UTF-16");

については

そして

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

私は混乱していますが、BOMはFE FFではありませんか?それはなぜあなたのプリントアウトで76〜77ですか? – Roland

+0

Roland - いくつかの小さなタイプミスが非常に不正確な16進出力を生成するために協力していたことをありがとう。 – tucuxi

1

String.getBytes()デフォルトプラットフォームエンコーディングを使用しています。エンコーディング[...]「UTF-16(16ビットUnicode変換形式)は、文字エンコーディングです:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) by Joel Spolsky

そして、これも同様に役立ちますが:私はこれが役立つと思います。この

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

をお試しください可変長符号化であり、符号点は1つまたは2つの16ビット符号単位で符号化される。 (Wikipedia

2

文字列は、プラットフォームのデフォルトの文字コードを使用してバイト列にエンコードされます。

あなたのプラットフォームのデフォルトの文字セットは、ISO-8859-1(または同様のchar型の1バイトあたりの文字セット)であると仮定します。これらの文字セットは1文字を1バイトにエンコードします。

エンコードを指定する場合は、方法String.getBytes(Charset)またはString.getBytes(String)を使用します。

16ビットの格納について:Javaのは内部での文字列も格納する方法です。元のUnicode仕様に基づいています。

関連する問題