Я хочу сначала добавить некоторый код, а затем немного пояснений:
import java.nio.charset.Charset;
public class Main {
public static void main(String[] args) {
System.out.println("Character size: " + Character.SIZE / 8);
final byte[] bytes = "a".getBytes(Charset.forName("UTF-16"));
System.out.println("String size: " + bytes.length);
sprintByteAsHex(bytes[0]);
sprintByteAsHex(bytes[1]);
sprintByteAsHex(bytes[2]);
sprintByteAsHex(bytes[3]);
}
static void sprintByteAsHex(byte b) {
System.out.print((Integer.toHexString((b & 0xFF))));
}
}
И результат будет:
Character size: 2
String size: 4
feff061
Итак, чего вы на самом деле упускаете, так это того, что выне предоставляют никаких параметров для метода getBytes .Возможно, вы получаете байты для UTF-8 представления символа «a».
Хорошо, но почему мы получили 4 байта, когда мы запросили UTF-16?Хорошо, Java использует UTF-16 внутренне, тогда мы должны были получить 2 байта правильно?
Если вы изучите вывод:
feff061
Java фактически вернула нам спецификацию: https://en.wikipedia.org/wiki/Byte_order_mark.
Таким образом, первые 2 байта: feff необходимы для сигнализации следующегобайтами будет UTF-16 Big Endian.Пожалуйста, обратитесь к странице Википедии для получения дополнительной информации.
Оставшиеся 2 байта: 0061 - это 2-байтовое представление имеющегося у вас символа "a".Можно проверить по: http://www.fileformat.info/info/unicode/char/0061/index.htm
Так что да, символ в Java составляет 2 байта, но когда вы запрашиваете байты без определенной кодировки, вы не всегда можете получить 2 байта, так как для разных кодировок потребуется разное количествобайтов для различных символов.