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


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

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

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

2 58

2 ответа:

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

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

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

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

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

ответ: 6 байт

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

по словам очевидцев, на которые ссылается в в принятом ответе говорится, что только четыре байта имеют отношение к кодировке UTF-16, поэтому это правильно, только если мы добавим context

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

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

ответ, если охватывает все unicode: 4 байта

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

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

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

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

ответ, если собирается UTF-8 - > собственная кодировка: 4 байта

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