Каково максимальное количество байтов для одного символа в кодировке UTF-8?
Я буду шифровать байты строки, закодированной в UTF-8, и поэтому мне нужно иметь возможность определить максимальное количество байтов для строки в кодировке UTF-8.
Может ли кто-нибудь подтвердить максимальное количество байтов для одного символа в кодировке UTF-8, пожалуйста
Ответы:
Максимальное количество байтов на символ составляет 4 в соответствии с RFC3629, который ограничивает таблицу символов следующим образом
U+10FFFF
:(Исходная спецификация допускала до шести байтовых кодов символов для прошлых кодовых точек
U+10FFFF
.)Для символов с кодом меньше 128 потребуется только 1 байт, а для следующих 1920 кодов символов потребуется только 2 байта. Если вы не работаете с эзотерическим языком, умножение количества символов на 4 будет значительным переоценкой.
источник
11111111
и2^(6*7)
немного места для символов?Без дальнейшего контекста я бы сказал, что максимальное количество байтов для символа в UTF-8 составляет
ответ: 6 байт
Автор принятого ответа правильно указал на это как на «исходную спецификацию». Это действовало до RFC-2279 1 . Как отметил Дж. Коко в комментариях ниже, это изменилось в 2003 году с появлением RFC-3629 2 , который ограничивает UTF-8 кодированием для 21 бита, что может быть обработано схемой кодирования с использованием четырех байтов.
ответ, если покрывает весь юникод: 4 байта
Но в Java <= v7 они говорят о 3-байтовом максимуме для представления Unicode с UTF-8? Это потому, что исходная спецификация Unicode определяла только базовую многоязычную плоскость ( BMP ), то есть это более старая версия unicode или подмножество современного unicode. Так
ответ, если представляет только исходный юникод, BMP: 3 байта
Но ОП говорит о том, чтобы пойти другим путем. Не из символов в байты UTF-8, а из байтов UTF-8 в «Строку» байтового представления. Возможно, автор принятого ответа получил это из контекста вопроса, но это не обязательно очевидно, поэтому может сбить с толку случайного читателя этого вопроса.
Переходя от UTF-8 к собственной кодировке, мы должны посмотреть, как реализована «строка». Некоторые языки, такие как Python> = 3, будут представлять каждый символ целыми кодовыми точками, что позволяет использовать 4 байта на символ = 32 бита, чтобы покрыть 21, который нам нужен для Unicode, с некоторыми потерями. Почему не совсем 21 бит? Потому что все происходит быстрее, когда они выровнены по байтам. Некоторые языки, такие как Python <= 2 и Java, представляют символы с использованием кодировки UTF-16, что означает, что они должны использовать суррогатные пары для представления расширенного юникода (не BMP). В любом случае это все еще максимум 4 байта.
ответьте, если идете UTF-8 -> собственная кодировка: 4 байта
Итак, окончательный вывод, 4 - наиболее распространенный правильный ответ, так что мы все правильно поняли. Но пробег может отличаться.
источник
1F FF FF
или 21 бит. Число 0x110000 соответствует 17 плоскостям с кодовыми точками 0x10000 каждая.Максимальное количество байтов для поддержки US-ASCII, стандартной кодировки английского алфавита, равно 1. Но ограничение текста английским языком становится все менее желательным или практичным с течением времени.
Unicode был разработан для представления глифов всех человеческих языков, а также многих видов символов с различными характеристиками воспроизведения. UTF-8 - эффективная кодировка для Unicode, хотя по-прежнему смещена в сторону английского языка. UTF-8 является самосинхронизирующимся: границы символов легко идентифицируются путем сканирования четко определенных битовых шаблонов в любом направлении.
Хотя максимальное количество байтов на символ UTF-8 составляет 3 для поддержки только 2-байтового адресного пространства плоскости 0, базовой многоязычной плоскости (BMP), которая может быть принята как минимальная поддержка в некоторых приложениях, это 4 для поддержки все 17 текущих плоскостей Unicode (по состоянию на 2019 год). Следует отметить, что многие популярные символы «эмодзи», вероятно, будут расположены в плоскости 16, для которой требуется 4 байта.
Однако это только для основных символов символов. Существуют также различные модификаторы, такие как добавление акцентов к предыдущему символу, и также можно связать вместе произвольное количество кодовых точек для создания одной сложной «графемы». Поэтому в реальном программировании использование или допущение фиксированного максимального количества байтов на символ, вероятно, в конечном итоге приведет к проблемам для вашего приложения.
Эти соображения подразумевают, что строки символов UTF-8 не должны «расширяться» до массивов фиксированной длины до обработки, как это иногда делается. Вместо этого программирование должно выполняться напрямую с использованием строковых функций, специально разработанных для UTF-8.
источник