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 ialah format pengekodan panjang berubah-ubah dengan sekurang-kurangnya dua bait. Kerana ia adalah dua bait, Big Endian dan Endian Kecil terlibat. Dalam contoh anda di atas, kerana endianess tidak ditentukan, BOM dua bait ditambah. Ditambah dengan dua bait pengekodan aksara asal (ASCII), jadi 4 bait. Jika anda menggunakan utf-16-le atau utf-16-be, ia akan menjadi dua bait. Sila semak diri anda untuk perwakilan Java tertentu.
Selepas penyahkodan UTF-16
Terdapat feff pada permulaan, yang digunakan untuk menunjukkan bahawa rentetan adalah big-endian (bait tertib tinggi berada di hadapan. Sebab tanda ini ialah terdapat dua jenis big-endian). dan little-endian (bait tertib tinggi berada di belakang) dalam Mod, 0x01 0x02 dibaca sebagai 0x0102 dalam endian besar, dan nilai yang sama dibaca sebagai 0x0201 dalam endian kecil, yang berbeza, jadi ia memerlukan. untuk ditanda dalam feff.