В какой кодировке Java использует UTF-8 или UTF-16?
Я уже прочитал следующие посты:
Каково внутреннее представление Java для String? Модифицированный UTF-8? UTF-16?https://docs.oracle.com/javase/8/docs/api/java/lang/String.htmlТеперь рассмотрим код, приведенный ниже:
public static void main(String[] args) {
printCharacterDetails("最");
}
public static void printCharacterDetails(String character){
System.out.println("Unicode Value for "+character+"="+Integer.toHexString(character.codePointAt(0)));
byte[] bytes = character.getBytes();
System.out.println("The UTF-8 Character="+character+" | Default: Number of Bytes="+bytes.length);
String stringUTF16 = new String(bytes, StandardCharsets.UTF_16);
System.out.println("The corresponding UTF-16 Character="+stringUTF16+" | UTF-16: Number of Bytes="+stringUTF16.getBytes().length);
System.out.println("----------------------------------------------------------------------------------------");
}
Когда я попытался отладить строкуcharacter.getBytes()
в приведенном выше коде отладчик взял меня вgetBytes()
метод класса String, а затем вstatic byte[] encode(char[] ca, int off, int len)
метод класса StringCoding. Первая строка метода кодирования (String csn = Charset.defaultCharset().name();
) вернул «UTF-8» в качестве кодировки по умолчанию во время отладки. Я ожидал, что это будет "UTF-16".
Выход программы:
Значение Юникода для 最 = 6700 Символ UTF-8 = 最 | По умолчанию: число байтов = 3
Соответствующий символ UTF-16 = | UTF-16: количество байтов = 6
Когда я явно преобразовал его в UTF-16 в программе, потребовалось 6 байтов для представления символа. Разве он не должен использовать 2 или 4 байта для UTF-16? Почему было использовано 6 байтов?
Где я иду не так в моем понимании? Я использую Ubuntu 14.04, и команда locale показывает следующее:
LANG=en_US.UTF-8
Означает ли это, что JVM решает, какую кодировку использовать на основе базовой ОС, или она использует только UTF-16? Пожалуйста, помогите мне понять концепцию.