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

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

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

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

Ответы [ 2 ]

74 голосов
/ 02 марта 2012

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

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

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

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

30 голосов
/ 27 января 2016

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

. Ответ: 6 байтов.

. Автор принятого ответа правильно указал на это.как «оригинальная спецификация».Это было действительно в RFC-2279 1 .Как отметил Дж. Коко в комментариях ниже, это изменилось в 2003 году с RFC-3629 2 , который ограничивает UTF-8 кодированием для 21 бита, который может обрабатываться с помощью схемы кодирования с использованием четырех байтов.

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

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

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

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

Переходя от UTF-8 к нативной кодировке, мы имеемпосмотреть, как реализована «Строка».Некоторые языки, такие как Python> = 3, будут представлять каждый символ целочисленными кодовыми точками, что позволяет использовать 4 байта на символ = 32 бита, чтобы покрыть 21, который нам нужен для юникода, с некоторыми потерями.Почему не точно 21 бит?Потому что вещи быстрее, когда они выровнены по байту.Некоторые языки, такие как Python <= 2 и <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html" rel="nofollow noreferrer"> Java , представляют символы с использованием кодировки UTF-16, что означает, что они должны использовать суррогатные пары для представления расширенного Unicode (не BMP).В любом случае это по-прежнему максимум 4 байта.

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

Итак, окончательный вывод, 4 является наиболее распространенным правильным ответом, поэтому мы получили егоправо.Но пробег может варьироваться.

...