Подтвердить что ты не робот

Каково максимальное количество байтов для кодированного символа UTF-8?

Каково максимальное количество байтов для одного кодированного символа UTF-8?

Я буду шифровать байты строки, закодированной в UTF-8, и, следовательно, должен иметь возможность выработать максимальное количество байтов для кодированной строки UTF-8.

Может ли кто-нибудь подтвердить максимальное количество байтов для одного кодированного символа UTF-8, пожалуйста,

4b9b3361

Ответ 1

Максимальное количество байтов на символ равно 4 в соответствии с RFC3629, которое ограничивало таблицу символов U+10FFFF:

В UTF-8 символы из диапазона U + 0000..U + 10FFFF (UTF-16    доступный диапазон) кодируются с использованием последовательностей от 1 до 4 октетов.

(Исходная спецификация допускала до шести байтовых кодов символов для кодовых точек минус U+10FFFF.)

Для символов с кодом менее 128 требуется только 1 байт, а следующие коды символов 1920 - только 2 байта. Если вы не работаете с эзотерическим языком, умножение числа символов на 4 будет значительной завышенной оценкой.

Ответ 2

Без дальнейшего контекста я бы сказал, что максимальное количество байтов для символа в UTF-8 равно

ответ: 6 байт

Автор принятого ответа правильно указал на это как на "оригинальную спецификацию", но я думаю, что это вводит в заблуждение читателя, поскольку, насколько я знаю, это все еще текущая и правильная спецификация, за wikipedia и за книгу Google по UTF-8 в Java.

RFC, на который ссылается принятый ответ, утверждает, что только четыре байта относятся к кодировке UTF-16, так что это правильно, только если мы добавляем контекст

ответ, если перевод только символов из UTF-16 в UTF-8: 4 байта

Теперь, все ли символы, которые могут быть представлены UTF-16 полезными? В соответствии с wikipedia снова, unicode может представлять до кодовых точек x10FFFF. Таким образом, включая 0, это означает, что мы можем сделать это с помощью этих байтов: F FF FF, то есть два с половиной байта или 20 бит. Оглядываясь на спецификацию UTF-8, мы видим, что мы можем представлять 20 бит с четырьмя байтами с кодировкой UTF-8. Так

ответ, если он охватывает весь юникод: 4 байта

Но, в Java <= v7, они говорят о 3-байтовом максимуме для представления unicode с UTF-8? Это потому, что исходная спецификация Юникода определяла только базовую многоязычную плоскость (BMP), то есть это более ранняя версия юникода или подмножество современных юникода. Так

ответ, если он представляет только оригинальный юникод, BMP: 3 байта

Но OP говорит о том, чтобы идти в другую сторону. Не от символов до байтов UTF-8, а от байтов UTF-8 до "String" представления байтов. Возможно, автор принятого ответа получил это из контекста вопроса, но это не обязательно очевидно, поэтому может запутать случайного читателя этого вопроса.

Переходя от UTF-8 к собственной кодировке, мы должны посмотреть, как реализована "String". Некоторые языки, такие как Python >= 3, будут представлять каждый символ с целыми кодовыми точками, что позволяет использовать 4 байта на символ = 32 бит, чтобы покрыть 20, которые нам нужны для unicode, с некоторыми отходами. Почему не ровно 20 бит? Потому что вещи быстрее, когда они выровнены по байтам. Некоторые языки, такие как Python <= 2 и Java, представляют символы с использованием кодировки UTF-16, что означает, что они должны использовать суррогатные пары для представляют расширенный unicode (не BMP). В любом случае, все еще 4 байта.

ответ при переходе UTF-8 → родная кодировка: 4 байта

Итак, окончательный вывод, 4 - самый общий правильный ответ, поэтому мы поняли это правильно. Но в определенных контекстах вы должны быть осторожны. Например, не ожидайте, что вы можете представлять все, что вы читаете из потока UTF-8, максимум в 4 байта. Если это не unicode, вам может понадобиться до 6 байтов.