2014-01-07 5 views
12

Я пытался понять кодировку символов в Java. Символы в Java хранятся в 16 бит с использованием кодировки UTF-16. Поэтому, когда я конвертирую строку, содержащую 6 символов, в байт, я получаю 6 байтов, как показано ниже, я ожидаю, что это будет 12. Есть ли какая-то концепция, которую я не вижу?UTF-16 Кодировка символов 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: длина массива символов составляет 6

В соответствии с @Darshan При попытке с UTF-16 кодирования, чтобы получить байт результат также не ожидали.

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 »);' , но я удивляюсь, о/р есть 14 –

+1

да Даршан, то же самое здесь. Это должно быть 12 правильно !!! – priyaranjan

+7

Для этого вам нужно использовать 'utf-16le' или' utf-16be' , пожалуйста, обратитесь к [link] http://rosettacode.org/wiki/String_length для получения более подробной информации. –

ответ

9

В версии UTF-16 вы получаете 14 байтов из-за введенного маркера для различения Big Endian (по умолчанию) и Little Endian. Если вы укажете 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 

И

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

Im confused, не должна ли спецификация FE FF? Почему это 76 ~ 77. в распечатке? – Roland

+0

Благодарим за пятнистость, Роланд - несколько небольших опечаток сотрудничали для производства очень неправильного выходного сигнала. – tucuxi

1

String.getBytes() использует по умолчанию платформу кодирования. Попробуйте этот

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

Я думаю, что это поможет: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) by Joel Spolsky

И это поможет, а также: «UTF-16 (16-битный Unicode Transformation Format) является кодировка символов [...] Кодирование является кодировкой переменной длины, поскольку кодовые точки кодируются одним или двумя 16-разрядными кодовыми единицами. " (От Wikipedia)

2

согласно String.getBytes() method's documentation, строка кодируется в виде последовательности байтов, используя кодировку по умолчанию в платформы.

Я предполагаю, что ваша кодировка по умолчанию для платформы будет ISO-8859-1 (или аналогичная одна байт на чар-кодировку). Эти кодировки кодируют один символ в один байт.

Если вы хотите указать кодировку, используйте метод String.getBytes(Charset) или String.getBytes(String).

О 16-разрядном хранении: так Java внутренне хранит символы, а также строки. Он основан на исходной спецификации Unicode.

1

Для использования UTF-16 кодирования str.getBytes("UTF-16");

но дает 14 длину байт [] см [ссылка] http://rosettacode.org/wiki/String_length для получения более подробной информации.

Смежные вопросы