String str1="a";
String str2="b";
String str3="c";
String str4="abc";
System.out.println(str1.getBytes("UTF-16").length);//4
System.out.println(str2.getBytes("UTF-16").length);//4
System.out.println(str3.getBytes("UTF-16").length);//4
System.out.println(str4.getBytes("UTF-16").length);//8
System.out.println(str1.getBytes("UTF-8").length);//1
System.out.println(str2.getBytes("UTF-8").length);//1
System.out.println(str3.getBytes("UTF-8").length);//1
System.out.println(str4.getBytes("UTF-8").length);//3
System.out.println(str1.getBytes("UTF-32").length);//4
System.out.println(str2.getBytes("UTF-32").length);//4
System.out.println(str3.getBytes("UTF-32").length);//4
System.out.println(str4.getBytes("UTF-32").length);//12
Unicde编码中不明白的,像UTF-8/UTF-32中str4编码后字节数都是str1+str2+str3,但UTF-16则不然,UTF-16到底是如何编码的呢?求赐教。
UTF-16 est un format d'encodage de longueur variable avec un minimum de deux octets. Parce qu'il s'agit de deux octets, Big Endian et Small Endian sont impliqués. Dans votre exemple ci-dessus, comme endianess n'est pas spécifié, une nomenclature de deux octets est ajoutée. Plus les deux octets du codage du caractère original (ASCII), cela fait donc 4 octets. Si vous utilisez utf-16-le ou utf-16-be, ce sera deux octets. Veuillez vérifier vous-même la représentation Java spécifique.
Après décodage UTF-16
Il y a feff au début de, qui est utilisé pour indiquer que la chaîne est big-endian (l'octet de poids fort est au début). La raison de cette marque est qu'il existe deux types de big-endian. et little-endian (l'octet de poids fort est à l'arrière) dans le mode système, 0x01 0x02 est lu comme 0x0102 en big endian, et la même valeur est lue comme 0x0201 en little endian, ce qui est différent, donc il en a besoin. à marquer en feff.