Каково максимальное количество байтов для кодированного символа UTF-8?
Каково максимальное количество байтов для одного кодированного символа UTF-8?
Я буду шифровать байты строки, закодированной в UTF-8, и, следовательно, должен иметь возможность выработать максимальное количество байтов для кодированной строки UTF-8.
Может ли кто-нибудь подтвердить максимальное количество байтов для одного символа, кодированного UTF-8, пожалуйста,
- Как создать строковый литерал UTF-8 в Visual C ++ 2008
- Сохранить текстовый файл UTF-8, закодированный с помощью VBA
- R tm заблокировать недопустимый ввод в 'utf8towcs'
- установка UTF-8 в java и csv-файле
- Чтение InputStream как UTF-8
- Сериализация объекта как XML UTF-8 в .NET.
- Tmux: пытается связать ключ utf8
- Как загрузить исходный () .R-файл с использованием кодировки UTF-8?
- Что такое внутреннее представление Java для String? Изменен UTF-8? UTF-16?
- Действительно хорошие, плохие примеры тестовых данных UTF-8
- кириллица в Windows Console (java) System.out.println ();
- UTF-8, UTF-16 и UTF-32
- utf 8 charset не работает с javax mail
Максимальное количество байтов на символ равно 4 согласно RFC3629, которое ограничивало таблицу символов U+10FFFF
:
В UTF-8 символы из диапазона U + 0000..U + 10FFFF (ansible диапазон UTF-16) кодируются с использованием последовательностей от 1 до 4 октетов.
(Исходная спецификация допускала до шести байтовых кодов символов для кодовых точек мимо U+10FFFF
.)
Для символов с кодом менее 128 требуется только 1 байт, а следующие коды символов 1920 – только 2 байта. Если вы не работаете с эзотерическим языком, умножение количества символов на 4 будет значительной переоценкой.
Без дальнейшего контекста я бы сказал, что максимальное количество байтов для символа в UTF-8 является
ответ: 6 байт
Автор принятого ответа правильно указал на это как на «оригинальную спецификацию», но я считаю, что это вводит в заблуждение читателя, поскольку, насколько я знаю, это все еще текущая и правильная спецификация, по википедии и за книгу 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. Так
ответ, если охватывать все unicode: 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 – самый общий правильный ответ, так что мы поняли это правильно. Но в определенных контекстах вы должны быть осторожны. Например, не ожидайте, что вы сможете представлять все, что вы читаете из streamа UTF-8, максимум в 4 байта. Если это не юникод, вам может понадобиться до 6 байтов.