string - Сколько байтов принимает один символ Unicode?
Я немного запутался в кодировках. Насколько мне известно, старые символы ASCII принимали по одному байту за символ. Сколько байтов требуется символу Unicode?
Я предполагаю, что один символ Юникода может содержать все возможные символы с любого языка - я прав? Итак, сколько байтов требуется для каждого символа?
А что означают UTF-7, UTF-6, UTF-16 и т. Д.? Являются ли они разными версиями Unicode?
Я прочитал статью в Википедии об Unicode, но для меня это довольно сложно. Я с нетерпением жду ответа на простой ответ.
10FFFF - это последний код кодировки unicode по определению, и он определен таким образом, потому что это технический предел UTF-16.
Он также является самым большим кодеком UTF-8, который может кодировать в 4 байта, но идея кодирования UTF-8 также работает для кодировок 5 и 6 байтов для покрытия кодовых точек до 7FFFFFFF, т.е. половина того, что может делать UTF-32.
В Unicode ответ нелегко дать. Проблема, как вы уже указывали, - это кодировки.
Учитывая любое английское предложение без диакритических символов, ответ для UTF-8 будет таким же количеством байтов, что и символы, а для UTF-16 это будет число символов раз два.
Единственная кодировка, где (на данный момент) мы можем сделать утверждение о размере UTF-32. Там он всегда 32 бит на персонажа, хотя я думаю, что кодовые точки подготовлены для будущего UTF-64 :)
Что делает его настолько трудным, по крайней мере, две вещи:
- состоящие из символов, где вместо использования символьной сущности, которая уже подчеркнута / диакритическая (À), пользователь решил объединить акцент и базовый символ (`A).
- кодовые точки. Кодовые точки - это метод, с помощью которого кодировки UTF позволяют кодировать больше, чем количество бит, которое дает им свое имя, как правило, позволяют. Например, UTF-8 обозначает определенные байты, которые сами по себе недействительны, но если следовать за допустимым байтом продолжения, это позволит описать символ за пределами 8-битного диапазона 0..255. См. Examples и Overlong Encodings ниже в статье Википедии о UTF-8.
- Отличный пример U+20AC что символ € (кодовая точка U+20AC может быть представлен либо как трехбайтная последовательность E2 82 AC либо четырехбайтная последовательность F0 82 82 AC .
- Оба действительны, и это показывает, насколько сложным является ответ, говоря о «Юникоде», а не о конкретной кодировке Unicode, такой как UTF-8 или UTF-16.
Для UTF-16 персонаж нуждается в четырех байтах (два блока кода), если он начинается с 0xD800 или выше; такой символ называется «суррогатной парой». Более конкретно, суррогатная пара имеет форму:
где [. ] указывает двухбайтовый блок кода с заданным диапазоном. Anything <= 0xD7FF - это один блок кода (два байта). Ничего> = 0xE000 недействительно (кроме маркеров спецификации, возможно).
Как ни странно, никто не указал, как рассчитать, сколько байтов принимает один символ Unicode. Вот правило для кодированных строк UTF-8:
Итак, быстрый ответ: он занимает от 1 до 4 байт, в зависимости от первого, который укажет, сколько байтов оно займет.
Обновить
Как указывал Преветт , это правило применяется только к UTF-8
Проверьте этот конвертер кода Юникода . Например, введите 0x2009 , где 2009 - номер Юникода для тонкого пространства , в поле «0x . нотация» и нажмите «Преобразовать». В поле «Кодовые единицы UTF-8» появляется шестнадцатеричное число E2 80 89 (3 байта).
Проще говоря, Unicode - это стандарт, который присваивает один номер (называемый кодовой точкой) всем персонажам мира (его работа продолжается).
Теперь вам нужно представить эти кодовые точки, используя байты, которые называются character encoding . UTF-8, UTF-16, UTF-6 - это способы представления этих символов.
UTF-8 - многобайтовая кодировка символов. Символы могут иметь от 1 до 6 байтов (некоторые из них могут не потребоваться прямо сейчас).
UTF-32 каждый символ имеет 4 байта символов.
UTF-16 использует 16 бит для каждого символа и представляет только часть символов Юникода под названием BMP (для всех практических целей это достаточно). Java использует эту кодировку в своих строках.
Я знаю, что этот вопрос старый и уже имеет принятый ответ, но я хочу предложить несколько примеров (надеясь, что это будет полезно кому-то).
Насколько мне известно, старые символы ASCII принимали по одному байту за символ.
Правильно. Фактически, поскольку ASCII является 7-битным кодированием, он поддерживает 128 кодов (95 из которых можно печатать), поэтому он использует только половину байта (если это имеет смысл).
Сколько байтов требуется символу Unicode?
Юникод просто сопоставляет символы с кодовыми точками. Он не определяет, как их кодировать. Текстовый файл не содержит символов Юникода, но байты / октеты, которые могут представлять символы Юникода.
Я предполагаю, что один символ Юникода может содержать все возможные символы с любого языка - я прав?
Нет. Но почти. Так что в принципе да. Но все равно нет.
Итак, сколько байтов требуется для каждого символа?
То же, что и ваш второй вопрос.
И что означают UTF-7, UTF-6, UTF-16? Это какие-то Unicode-версии?
Нет, это кодировки. Они определяют, как байты / октеты должны представлять символы Юникода.