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

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

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

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

Максимальное количество байтов на символ равно 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 байтов.

  • Извлеките большой ZIP-файл (50 ГБ) на Mac OS X
  • Кодирование FPDF utf-8 (HOW-TO)
  • Проблемы чтения / записи данных UTF-8 в MySQL из Java с использованием JDBC-коннектора 5.1
  • Преобразование UTF-8 в ISO-8859-1 в Java - как сохранить его как один байт
  • Использование 'use utf8;' дает мне «Широкий характер в печати»,
  • Кодировка Spring MVC UTF-8
  • Как распознавать символы UTF-8 в кодированном латинском столбце - MySQL
  • Как поддерживать кодировку UTF-8 в Eclipse
  • «Неверное строковое значение» при попытке вставить UTF-8 в MySQL через JDBC?
  • Как проверить, действительно ли файл UTF-8?
  • Извлечение текста UTF-8 из MySQL в R возвращает «????»
  • Interesting Posts
    Давайте будем гением компьютера.