UTF-8 - это многобайтовая кодировка переменной длины.
Чтобы что-то, читающее поток байтов, знало, что есть еще байты, которые нужно прочитать, чтобы завершить sh текущий codepoint, есть некоторые значения, которые просто не могут встретиться в допустимом потоке байтов UTF-8. В основном, определенные шаблоны указывают на «подожди, я еще не закончил».
Есть таблица, которая объясняет это здесь . Для кодовой точки в диапазоне от U + 0800 до U + FFFF для ее представления требуется 16 бит; его байтовое представление состоит из 3 байтов:
1st byte 2nd byte 3rd byte
1110xxxx 10xxxxxx 10xxxxxx
Вы видите 232 175 182
, потому что это байты кодировки UTF-8.
byte[] bytes = "诶".getBytes(StandardCharsets.UTF_8);
for (byte b : bytes) {
System.out.println((0xFF & b) + " " + Integer.toString(0xFF & b, 2));
}
Демо Ideone
Вывод:
232 11101000
175 10101111
182 10110110
Итак, 3 байта следуют шаблону, описанному выше.