Вычислите сколько байт потребуется для хранения сообщения в кодировке юникод сообщение

Обновлено: 02.07.2024

Я немного запутался в кодировках. Насколько мне известно, старые символы ASCII принимали по одному байту за символ. Сколько байтов требуется символу Unicode?

Я предполагаю, что один символ Юникода может содержать любой возможный символ с любого языка - я прав? Итак, сколько байтов требуется для каждого символа?

А что означают UTF-7, UTF-6, UTF-16 и т.д.? Являются ли они разными версиями Юникода?

Я прочитал статью в Википедии о Юникоде, но для меня это довольно сложно. Я с нетерпением жду ответа на простой ответ.

ОТВЕТЫ

Ответ 1

Вы не увидите простой ответ, потому что его нет.

Во-первых, Unicode не содержит "каждого символа с каждого языка", хотя он действительно пытается попробовать.

Юникод сам по себе является сопоставлением, он определяет кодовые точки, а кодовой точкой является число, связанное обычно с символом. Обычно я говорю, потому что есть такие понятия, как объединение символов. Вы можете быть знакомы с такими вещами, как акценты или умлауты. Они могут использоваться с другим символом, таким как a или u , чтобы создать новый логический символ. Следовательно, символ может состоять из 1 или более кодовых точек.

Чтобы быть полезным в вычислительных системах, нам нужно выбрать представление для этой информации. Это различные кодировки unicode, такие как utf-8, utf-16le, utf-32 и т.д. Они в значительной степени отличаются размером их кодовых элементов. UTF-32 - это простейшая кодировка, у нее есть код, 32 бита, что означает, что отдельный кодовый адрес удобно помещается в кодовую часть. Другие кодировки будут иметь ситуации, когда для кодовой точки потребуется несколько кодовых элементов, или что конкретный код не может быть вообще представлен в кодировке (это проблема, например, с UCS-2).

Из-за гибкости объединения символов даже в пределах данной кодировки количество байтов на символ может варьироваться в зависимости от характера и формы нормализации. Это протокол для работы с символами, которые имеют более одного представления (вы можете сказать "an 'a' with an accent" , который является 2 кодовыми точками, один из которых представляет собой комбинацию char или "accented 'a'" , которая является одной кодовой точкой).

Ответ 2

Как ни странно, никто не указал, как рассчитать, сколько байтов принимает один Unicode char. Вот правило для кодированных строк UTF-8:

Итак, быстрый ответ: он занимает от 1 до 4 байт, в зависимости от первого, который укажет, сколько байтов оно займет.

Update

Как указано prewett, это правило применимо только к UTF-8

Ответ 3

Проще говоря Unicode - это стандарт, который присваивает одному номеру (называемому кодовым пунктом) всем символам мира (его работа продолжается).

Теперь вам нужно представить эти кодовые точки, используя байты, которые называются character encoding . UTF-8, UTF-16, UTF-6 - это способы представления этих символов.

UTF-8 - многобайтовая кодировка символов. Символы могут иметь от 1 до 6 байтов (некоторые из них могут не потребоваться прямо сейчас).

UTF-32 каждый символ имеет 4 байта символов.

UTF-16 использует 16 бит для каждого символа и представляет только часть символов Unicode под названием BMP (для всех практических целей это достаточно). Java использует эту кодировку в своих строках.

Ответ 4

Я знаю, что этот вопрос старый и уже имеет принятый ответ, но я хочу предложить несколько примеров (надеясь, что это будет полезно кому-то).

Насколько я знаю, старые символы ASCII занимали один байт на символ.

Right. Фактически, поскольку ASCII является 7-битной кодировкой, он поддерживает 128 кодов (из которых 95 печатаются), поэтому он использует только половину байта (если это имеет смысл).

Сколько байтов требуется символу Unicode?

Юникод просто сопоставляет символы с кодовыми точками. Он не определяет, как их кодировать. Текстовый файл не содержит символов Юникода, но байты/октеты, которые могут представлять символы Юникода.

Я предполагаю, что один символ Юникода может содержать все возможные символ с любого языка - я прав?

Нет. Но почти. Так что в принципе да. Но все равно нет.

Итак, сколько байтов требуется для каждого символа?

То же, что и ваш второй вопрос.

А что означают UTF-7, UTF-6, UTF-16? Являются ли они своего рода Unicode версии?

Нет, это кодировки. Они определяют, как байты/октеты должны представлять символы Unicode.

    • U + 0061 ЛАТИНСКОЕ МАЛОЕ ПИСЬМО A: a
      • Nº: 97
      • UTF-8: 61
      • UTF-16: 00 61
      • U + 00A9 АВТОРСКИЕ ПРАВА: ©
        • Nº: 169
        • UTF-8: C2 A9
        • UTF-16: 00 A9
        • Nº: 174
        • UTF-8: C2 AE
        • UTF-16: 00 AE
        • U + 1337 ЭФИОПИЧЕСКАЯ СИЛЛАБНАЯ PHWA: ጷ
          • Nº: 4919
          • UTF-8: E1 8C B7
          • UTF-16: 13 37
          • Nº: 8212
          • UTF-8: E2 80 94
          • UTF-16: 20 14
          • Nº: 8240
          • UTF-8: E2 80 B0
          • UTF-16: 20 30
          • Nº: 8364
          • UTF-8: E2 82 AC
          • UTF-16: 20 AC
          • Nº: 8482
          • UTF-8: E2 84 A2
          • UTF-16: 21 22
          • Nº: 9731
          • UTF-8: E2 98 83
          • UTF-16: 26 03
          • Nº: 9742
          • UTF-8: E2 98 8E
          • UTF-16: 26 0E
          • Nº: 9748
          • UTF-8: E2 98 94
          • UTF-16: 26 14
          • Nº: 9786
          • UTF-8: E2 98 BA
          • UTF-16: 26 3A
          • Nº: 9873
          • UTF-8: E2 9A 91
          • UTF-16: 26 91
          • Nº: 9883
          • UTF-8: E2 9A 9B
          • UTF-16: 26 9B
          • Nº: 9992
          • UTF-8: E2 9C 88
          • UTF-16: 27 08
          • Nº: 10014
          • UTF-8: E2 9C 9E
          • UTF-16: 27 1E
          • Nº: 12320
          • UTF-8: E3 80 A0
          • UTF-16: 30 20
          • Nº: 32905
          • UTF-8: E8 82 89
          • UTF-16: 80 89
          • U + 1F4A9 PILE OF POO: 💩
            • Nº: 128169
            • UTF-8: F0 9F 92 A9
            • UTF-16: D8 3D DC A9
            • Nº: 128640
            • UTF-8: F0 9F 9A 80
            • UTF-16: D8 3D DE 80

            Хорошо, я увлекся.

            Ответ 5

            В Юникоде ответ нелегко дать. Проблема, как вы уже указали, - это кодировки.

            Учитывая любое английское предложение без диакритических символов, ответ для UTF-8 будет таким же количеством байтов, что и символы, а для UTF-16 это будет число символов раз два.

            Единственная кодировка, где (на данный момент) мы можем сделать утверждение о размере UTF-32. Там он всегда 32 бит на символ, хотя я думаю, что кодовые точки подготовлены для будущего UTF-64:)

            Что делает его настолько трудным, по крайней мере, две вещи:

            Ответ 6

            Ответ 7

            10FFFF - это последний код кодировки unicode по определению, и он определен таким образом, потому что это технический предел UTF-16.

            Это также самый большой кодовый дескриптор UTF-8, который может кодировать в 4 байта, но идея кодирования UTF-8 также работает для кодировок 5 и 6 байтов для покрытия кодовых точек до 7FFFFFFF, т.е. половина того, что может делать UTF-32.

            Ответ 8

            Для UTF-16 персонаж нуждается в четырех байтах (два блока кода), если он начинается с 0xD800 или выше; такой символ называется "суррогатной парой". Более конкретно, суррогатная пара имеет форму:

            где [. ] указывает двухбайтовый блок кода с заданным диапазоном. Anything = 0xE000 недействителен (кроме маркеров спецификации, возможно).

            Ответ 9

            Ну, я просто поднял на нем страницу Википедии, и в первой части я увидел, что "Unicode может быть реализован разными кодировками символов. Наиболее часто используемые кодировки - это UTF-8 (который использует один байт для любых символов ASCII, которые имеют одинаковые значения кода как в кодировке UTF-8, так и ASCII и до четырех байтов для других символов), теперь устаревший UCS-2 (который использует два байта для каждого символа, но не может кодировать каждый символ в текущем Unicode стандарт)"

            Как видно из этой цитаты, ваша проблема заключается в том, что вы предполагаете, что Unicode является единственным способом кодирования символов. Есть фактически несколько форм Unicode, и, опять же в этой цитате, у одного из них даже есть 1 байт на символ, как и то, к чему вы привыкли.

            Итак, ваш простой ответ, который вы хотите, состоит в том, что он меняется.

            Ответ 10

            Я знаю, что это только ссылка, но вы должны посмотреть на это.

            В нем объясняется, как python обрабатывает unicode, предоставляя четкое и краткое объяснение ASCII и UNICODE.

            Вот как я начал понимать кодировки вообще.

            Ответ 11

            Посмотрите Конвертер кода Unicode. Например, введите 0x2009 , где 2009 - это номер Юникода для тонкого пространства, в поле "0x. нотация" и нажмите "Конвертировать". Шестнадцатеричное число E2 80 89 (3 байта) появляется в поле "Кодовые единицы UTF-8".

            Онлайн калькулятор легко и непринужденно вычислит объем текста в битах, байтах и килобайтах. Для перевода в другие единицы измерения данных воспользуйтесь онлайн конвертером.

            Информационный вес (объем) символа текста определяется для следующих кодировок:
            Unicode UTF-8
            Unicode UTF-16
            ASCII, ANSI, Windows-1251

            Почему на windows сохраняя текст блокноте перенос строки занимает - 4 байта в юникоде или 2 байта в анси?
            Это историческое явление, которое берёт начало с дос, последовательность OD OA (\n\r ) в виндовс используются чтоб был единообразный вывод на терминал независимо консоль это или принтер. Но для вывода просто на консоль достаточно только \n.

            Я немного смущен кодировками. Насколько я знаю, старые символы ASCII занимали один байт на символ. Сколько байтов требуется символу Unicode?

            Я полагаю, что один символ Юникода может содержать все возможные символы с любого языка - я прав? Итак, сколько байтов нужно на символ?

            и что делают UTF-7, UTF-6, UTF-16 и т. д. в смысле? Являются ли они разными версиями Unicode?

            прочитал статья в Википедии о Unicode но это довольно сложно для меня. Я с нетерпением жду простого ответа.

            вы не увидите простой ответ, потому что его нет.

            во-первых, Unicode не содержит "каждый символ из каждого языка", хотя он, конечно, пытается.

            Unicode сам по себе является отображением, он определяет кодовые точки, А кодовая точка-это число, связанное с обычно символ. Я говорю обычно, потому что есть такие понятия, как сочетание символов. Вы можете быть знакомы с такими вещами, как акценты, или умляуты. Их можно использовать с другим персонажем, такие как a или u для создания нового логического символа. Поэтому символ может состоять из 1 или более кодов.

            чтобы быть полезным в вычислительных системах, нам нужно выбрать представление для этого информацию. Это различные кодировки unicode, такие как utf-8, utf-16le, utf-32 и т. д. Они отличаются в значительной степени размером своих codeunits. UTF-32-это самая простая кодировка, у нее есть codeunit, который составляет 32 бит, что означает, что индивидуальная кодовая точка подходит комфортно в центр. Другие кодировки будут иметь ситуации, когда кодовая точка будет нуждаться в нескольких кодовых единицах, или эта конкретная кодовая точка не может быть представлена в кодировке вообще (это проблема, например, с UCS-2).

            из-за гибкости объединения символов даже в пределах заданной кодировки количество байтов на символ может варьироваться в зависимости от символа и формы нормализации. Это протокол для работы с персонажами, которые имеют более чем одно представление (можно сказать "an 'a' with an accent" который является 2 кодовыми точками, одна из которых является комбинирующим символом или "accented 'a'" который является одной кодовой точкой).

            Как ни странно, никто не указал, как рассчитать сколько байт занимает один символ Юникода. Вот правило для строк в кодировке UTF-8:

            Итак, быстрый ответ: он занимает от 1 до 4 байт, в зависимости от первого, который укажет, сколько байтов он займет.

            обновление

            As prewett указал, это правило применяется только к UTF-8

            я знаю, этот вопрос старый и уже есть принятый ответ, но я хочу предложить несколько примеров (надеюсь, что это будет полезно кому-то).

            насколько я знаю, старые символы ASCII занимали один байт на символ.

            право. На самом деле, поскольку ASCII является 7-битной кодировкой, он поддерживает 128 кодов (95 из которых можно распечатать), поэтому он использует только половину байта (если это имеет смысл).

            сколько байтов делает Unicode характер требуется?

            Unicode просто сопоставляет символы с кодовыми точками. Он не определяет, как их кодировать. Текстовый файл содержит не символы Юникода, а байты/октеты, которые могут представлять символы Юникода.

            я полагаю, что один символ Юникода может содержать все возможные характер с любого языка-я прав?

            нет. Но почти. Так что в принципе да. Но все равно нет.

            Так сколько байты нужны для каждого символа?

            то же, что и ваш 2-й вопрос.

            и что означает UTF-7, UTF-6, UTF-16 и т. д.? Являются ли они своего рода Unicode версии?

            нет, это кодировки. Они определяют, как байты / октеты должны представлять символы Юникода.

            проще говоря Unicode - это стандарт, который присвоил один номер (называемый кодовой точкой) всем символам мира (его работа все еще продолжается).

            теперь вам нужно представить эти кодовые точки с помощью байтов, которые называются character encoding . UTF-8, UTF-16, UTF-6 способы представления этих символов.

            UTF-8 - это многобайтовая кодировка. Символы могут иметь от 1 до 6 байт (некоторые из них могут не потребоваться прямо сейчас).

            UTF-32 каждый символ имеет 4 байта характер.

            UTF-16 использует 16 бит для каждого символа и представляет только часть символов Юникода, называемых BMP (для всех практических целей его достаточно). Java использует эту кодировку в своих строках.

            в Unicode ответ дается нелегко. Проблема, как вы уже отметили, заключается в кодировках.

            учитывая любое английское предложение без диакритических символов, ответ для UTF-8 будет столько же байтов, сколько символов, а для UTF-16-количество символов, умноженное на два.

            единственная кодировка, в которой (на данный момент) мы можем сделать заявление о размере,-UTF-32. Там всегда 32bit на символ, хотя я предполагаю, что кодовые точки подготовлен к будущему UTF-64:)

            что делает это так сложно, по крайней мере две вещи:

            10FFFF-последняя кодовая точка unicode по определению, и она определена таким образом, потому что это Технический предел UTF-16.

            Это также самая большая кодовая точка UTF-8 может кодироваться в 4 байта, но идея кодирования UTF-8 также работает для 5 и 6 байтовых кодировок для покрытия кодовых точек до 7FFFFFFF, т. е. половина того, что может UTF-32.

            Ну, я просто вытащил страницу Википедии на ней тоже, и в вступительной части я увидел, что "Unicode может быть реализован различными кодировками символов. Наиболее часто используемых кодировок: UTF-8 (который использует один байт за любые ASCII символы, которые имеют одинаковые значения кодов в кодировке UTF-8 и ASCII кодировки, и до четырех байтов для других персонажей), ныне устаревшей кодировке UCS-2 (который использует два байта для каждого символа, но не может кодировать каждый символ в текущей кодировке Unicode стандарт)"

            Как показывает эта цитата, ваша проблема заключается в том, что вы предполагаете, что Unicode-это единственный способ кодирования символов. На самом деле существует несколько форм Unicode, и, опять же в этой цитате, один из них даже имеет 1 байт на символ, как и то, к чему вы привыкли.

            таким образом, ваш простой ответ, который вы хотите, заключается в том, что он меняется.

            для UTF-16 символу требуется четыре байта (две единицы кода), если он начинается с 0xD800 или больше; такой символ называется "суррогатной парой"."Более конкретно, суррогатная пара имеет вид:

            где [. ] указывает двухбайтовую кодовую единицу с заданным диапазоном. Anything = 0xE000 недопустимо (кроме маркеров спецификации, возможно).

            зацените конвертер кодов Юникода. Например, введите 0x2009 , где 2009-Это номер Unicode для тонкого пространства, в " 0x. поле "нотация" и нажмите кнопку Преобразовать. Шестнадцатеричное число E2 80 89 (3 байта) отображается в поле "кодовые единицы UTF-8".

            Я немного запутался в кодировках. Насколько я знаю, старые символы ASCII занимали один байт на символ. Сколько байтов требуется для символа Юникода?

            Я предполагаю, что один символ Unicode может содержать все возможные символы из любого языка - я прав? Так сколько байт нужно для каждого символа?

            А что означают UTF-7, UTF-6, UTF-16 и т. Д.? Это разные версии Unicode?

            Я прочитал статью про Unicode из Википедии, но это довольно сложно для меня. Я с нетерпением жду простого ответа.

            Простите, простого ответа нет. Я нахожу все это немного беспорядочным. Unicode был объявлен как использующий два байта и способный представлять все символы, но оказывается, что двух байтов было недостаточно.

            Клингон не является частью самого стандарта Unicode, нет. Вместо этого используется личная зона использования Uniode (U + F8D0 - U + F8FF).

            Спаситель вопрос - спасибо. Моя ситуация заключается в хранении данных через совместимые с SCORM 1.2 LMS . стандарт для SCORM 1.2 'cmi.suspend_data' составляет 4096 байт данных, которые, как предполагал предыдущий разработчик, означали, что мы можем хранить 4096 символов. О человек, он был неправ - я только что обнаружил, почему наши закладки не работают на длинных курсах. Итак, теперь я знаю, что поскольку мы используем UTF-8, для каждого символа требуется 4 байта, что дает нам 1024 символа.

            Вы не увидите простого ответа, потому что его нет.

            Юникод сам по себе является отображением, он определяет кодовые точки, а кодовая точка - это число, связанное обычно с символом. Обычно я говорю, потому что есть такие понятия, как объединение персонажей. Вы можете быть знакомы с такими вещами, как акценты или умлауты. Они могут использоваться с другим символом, таким как a или, u чтобы создать новый логический символ. Следовательно, символ может состоять из 1 или более кодовых точек.

            Чтобы быть полезным в вычислительных системах, нам нужно выбрать представление для этой информации. Это различные кодировки Unicode, такие как utf-8, utf-16le, utf-32 и т. Д. Они отличаются в основном размером их кодовых блоков. UTF-32 - простейшая кодировка, она имеет кодовый блок 32 бита, что означает, что отдельная кодовая точка удобно вписывается в кодовый блок. В других кодировках будут ситуации, когда для кодовой точки потребуется несколько кодовых единиц или эта конкретная кодовая точка вообще не может быть представлена ​​в кодировке (это проблема, например, для UCS-2).

            Из-за гибкости объединения символов, даже в данной кодировке число байтов на символ может варьироваться в зависимости от символа и формы нормализации. Это протокол для работы с символами, которые имеют более одного представления (можно сказать, "an 'a' with an accent" что это 2 кодовые точки, одна из которых представляет собой объединяющий символ или "accented 'a'" одна кодовая точка).

            ХОРОШО. Тогда сколько байтов занимает один данный символ, представленный в одной данной кодовой точке? Например, неразрывный пробел.

            Комбинированные символы превращают жизнь программиста в ад, когда дело доходит до написания strlen (), substr () и других функций манипулирования строками в массивах UTF8. Такая работа никогда не будет завершена и всегда глючит.

            Как ни странно, никто не указал, как рассчитать, сколько байтов занимает один символ Unicode. Вот правило для строк в кодировке UTF-8:

            Итак, быстрый ответ: он занимает от 1 до 4 байтов, в зависимости от первого, который будет указывать, сколько байтов он займет.

            Читайте также: