Выделение размера для массива символов Юникода [дубликат]

У меня была аналогичная проблема, и это было из-за того, что мне не удалось закрыть> ссылку на таблицу стилей.

57
задан Edd 2 March 2012 в 14:26
поделиться

2 ответа

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

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

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

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

64
ответ дан Tamás 1 September 2018 в 00:53
поделиться

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

ответ: 6 байт

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

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

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

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

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

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

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

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

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

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

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

24
ответ дан Joshua Richardson 1 September 2018 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: