(1) Я ожидал, что первый println должен получить «10», как я упоминал.Но почему 5?
Вы берете 5-символьную строку, кодируете ее как байты, используя кодировку UTF-16.
Затем вы создаете новую строку, декодируя байты (правильно) из UTF-16., что дает вам новую строку, состоящую из ваших исходных 5 символов снова.
(2) Для второго println я пытаюсь получить для него сначала сначала «UTF-8», а затем «UTF».-16" .Я полагаю, это также должно быть 10. Но на самом деле это 12.
Эта часть кода:
new String(h.getBytes("UTF-8"), "UTF-8")
на самом деле не работает.Это просто довольно дорогой способ скопировать строку.Вы кодируете строку в байтах, используя UTF-8 в качестве схемы кодирования, а затем создаете новую строку, декодируя закодированные в UTF-8 байты.
Так эффективно вы делаете это:
"hello".getBytes("UTF-16").length
Причиной дополнительных 2 байтов является то, что кодирование UTF-16 ставит BOM (метку порядка байтов) в качестве первой (2-байтовой) единицы кода.
Для получения дополнительной информации прочитайте часто задаваемые вопросы по Unicode на "UTF-8, UTF-16, UTF-32 & BOM" .