web-dev-qa-db-fra.com

Encodage de caractères UTF-16 de java

J'essayais de comprendre le codage de caractères en Java. Les caractères en Java sont stockés sur 16 bits en utilisant le codage UTF-16. Donc, pendant que je convertis une chaîne contenant 6 caractères en octets, je reçois 6 octets comme ci-dessous, je m'attends à ce qu'il en soit 12. Y a-t-il un concept qui me manque?

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: la longueur du tableau de caractères est de 6

Selon @Darshan Lorsque vous essayez avec l'encodage UTF-16 d'obtenir des octets, le résultat n'est également pas attendu.

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
13
priyaranjan

Dans la version UTF-16, vous obtenez 14 octets en raison d'un marqueur inséré pour distinguer Big Endian (valeur par défaut) de Little Endian. Si vous spécifiez UTF-16LE, vous obtiendrez 12 octets (petit-endian, aucun marqueur d'ordre d'octet ajouté).

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


EDIT - Utilisez ce programme pour examiner les octets générés par différents codages:

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 = "0123456789ABCDEF".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();   
    }
}

Par exemple, lors de l'exécution sous UTF-8 (sous d'autres codages par défaut de la JVM, les caractères pour FE et FF seraient différents), le résultat est le suivant:

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

Et

$ javac Test.Java  && Java -cp . Test hello UTF-16LE
10 bytes:
68h 00. 65e 00.
6Cl 00. 6Cl 00.
6Fo 00. 

Et 

$ javac Test.Java  && Java -cp . Test hello UTF-16BE
10 bytes:
00. 68h 00. 65e
00. 6Cl 00. 6Cl
00. 6Fo
11
tucuxi

Comme indiqué dans la documentation de la méthode String.getBytes() , la chaîne est codée en une suite d'octets à l'aide du jeu de caractères par défaut de la plate-forme platform.

Je suppose que votre jeu de caractères par défaut pour la plate-forme sera ISO-8859-1 (ou un jeu de caractères similaire, un octet par caractère). Ces jeux de caractères encoderont un caractère dans un octet.

Si vous souhaitez spécifier le codage, utilisez la méthode String.getBytes(Charset) ou String.getBytes(String) .

À propos du stockage 16 bits: C’est ainsi que Java en interne stocke les caractères, ainsi que les chaînes. Il est basé sur la spécification Unicode originale.

2
Seelenvirtuose

Pour le codage UTF-16, utilisez str.getBytes("UTF-16"); 

mais il donne une longueur de 14 octets [], veuillez vous reporter à [lien] http://rosettacode.org/wiki/String_length pour plus de détails.

1
Darshan Patel

String.getBytes() utilise par défaut platform encoding. Essaye ça

byte bt[] = str.getBytes("UTF-16");
1
Evgeniy Dorofeev

Je pense que cela aidera: Le minimum absolu que chaque développeur de logiciel doit absolument savoir positivement sur Unicode et les jeux de caractères (sans excuses!) De Joel Spolsky

Et cela aidera également: "UTF-16 (format de transformation Unicode 16 bits) est un codage de caractères [...]. Le codage est un codage de longueur variable car les points de code sont codés avec un ou deux 16 unités de code à bits. " (de Wikipedia )

0
Oleg Sklyar