Сколько занимает один символ utf 8

UTF-8 ( /you ti fi/ от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-бит») — распространённый стандарт кодирования символов, позволяющий более компактно хранить и передавать символы Юникода, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой ASCII. Стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D. Кодировка UTF-8 сейчас является доминирующей в веб-пространстве. Она также нашла широкое применение в UNIX-подобных операционных системах [1] . Формат UTF-8 был разработан 2 сентября 1992 года Кеном Томпсоном и Робом Пайком, и реализован в Plan 9 [2] . Идентификатор кодировки в Windows – 65001 [3] .

UTF-8, по сравнению с UTF-16, наибольший выигрыш в компактности даёт для текстов на латинице, поскольку латинские буквы без диакритических знаков, цифры и наиболее распространённые знаки препинания кодируются в UTF-8 лишь одним байтом, и коды этих символов соответствуют их кодам в ASCII. [4] [5]

Содержание

Алгоритм кодирования [ править | править код ]

Алгоритм кодирования в UTF-8 стандартизирован в RFC 3629 и состоит из 3 этапов:

1. Определить количество октетов (байтов), требуемых для кодирования символа. Номер символа берётся из стандарта Юникод.

Диапазон номеров символов Требуемое количество октетов
00000000-0000007F 1
00000080-000007FF 2
00000800-0000FFFF 3
00010000-0010FFFF 4

Для символов Юникода с номерами от U+0000 до U+007F (занимающими один байт c нулём в старшем бите) кодировка UTF-8 полностью соответствует 7-битной кодировке US-ASCII.

2. Установить старшие биты первого октета в соответствии с необходимым количеством октетов, определённом на первом этапе:

  • 0xxxxxxx — если для кодирования потребуется один октет;
  • 110xxxxx — если для кодирования потребуется два октета;
  • 1110xxxx — если для кодирования потребуется три октета;
  • 11110xxx — если для кодирования потребуется четыре октета.

Если для кодирования требуется больше одного октета, то в октетах 2-4 два старших бита всегда устанавливаются равными 102 (10xxxxxx). Это позволяет легко отличать первый октет в потоке, потому что его старшие биты никогда не равны 102.

Количество октетов Значащих бит Шаблон
1 7 0xxxxxxx
2 11 110xxxxx 10xxxxxx
3 16 1110xxxx 10xxxxxx 10xxxxxx
4 21 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

3. Установить значащие биты октетов в соответствии с номером символа Юникода, выраженном в двоичном виде. Начать заполнение с младших битов номера символа, поставив их в младшие биты последнего октета, продолжить справа налево до первого октета. Свободные биты первого октета, оставшиеся незадействованными, заполнить нулями.

Примеры кодирования [ править | править код ]

Символ Двоичный код символа UTF-8 в двоичном виде UTF-8 в шестнадцатеричном виде
$ U+0024 100100 00 100100 24
¢ U+00A2 10 100010 110 00010 10 100010 C2 A2
U+20AC 10 0000 10 101100 1110 0010 10 000010 10 101100 E2 82 AC
�� U+10348 1 0000 0011 01 001000 11110 000 10 010000 10 001101 10 001000 F0 90 8D 88
Читайте также:  Приложение на телефон для изменения лица

Маркер UTF-8 [ править | править код ]

Для указания, что файл или поток содержит символы Юникода, в начале файла или потока может быть вставлен маркер последовательности байтов (англ. Byte order mark, BOM ), который в случае кодирования в UTF-8 принимает форму трёх байтов: EF BB BF16 .

1-й байт 2-й байт 3-й байт
Двоичный код 1110 1111 1011 1011 1011 1111
Шестнадцатеричный код EF BB BF

Пятый и шестой байты [ править | править код ]

Изначально кодировка UTF-8 допускала использование до шести байтов для кодирования одного символа, однако в ноябре 2003 года стандарт RFC 3629 запретил использование пятого и шестого байтов, а диапазон кодируемых символов был ограничен символом U+10FFFF . Это было сделано для обеспечения совместимости с UTF-16.

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

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

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

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

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

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

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

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

Читайте также:  Приложение jw library на русском для компьютера

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

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

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

Обновить

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

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

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

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

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

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

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

Но почти. Так что в основном да. Но все же нет.

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

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

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

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

Пара примеров. Если некоторые из них не могут быть отображены в вашем браузере (возможно, из-за того, что шрифт не поддерживает их), перейдите по http://codepoints.net/U+1F6AA (замените 1F6AA на 1F6AA в шестнадцатеричном 1F6AA ), чтобы увидеть изображение.

    • U + 0061 ЛАТИНСКОЕ МАЛЕНЬКОЕ ПИСЬМО A: a
      • № 97
      • UTF-8: 61
      • UTF-16: 00 61
        • U + 00A9 АВТОРСКИЙ ЗНАК: ©
          • № 169
          • UTF-8: C2 A9
          • UTF-16: 00 A9
          • U + 00AE ЗАРЕГИСТРИРОВАННЫЙ ЗНАК: ®
            • № 174
            • UTF-8: C2 AE
            • UTF-16: 00 AE
              • U + 1337 ЭТИОПИЧЕСКИЙ СЛОВНЫЙ PHWA: ጷ
                • № 4919
                • UTF-8: E1 8C B7
                • UTF-16: 13 37
                • U + 2014 EM DASH: —
                  • № 8212
                  • UTF-8: E2 80 94
                  • UTF-16: 20 14
                  • ЗНАК U + 2030 НА МИЛЛИОН: ‰
                    • № 8240
                    • UTF-8: E2 80 B0
                    • UTF-16: 30 30
                    • ЗНАК Е + 20AC ЕВРО: €
                      • № 8364
                      • UTF-8: E2 82 AC
                      • UTF-16: 20 AC
                      • U + 2122 ЗНАК ТОРГОВОЙ МАРКИ: ™
                        • № 8482
                        • UTF-8: E2 84 A2
                        • UTF-16: 21 22
                        • U + 2603 снеговик: ☃
                          • № 9731
                          • UTF-8: E2 98 83
                          • UTF-16: 26 03
                          • U + 260E ЧЕРНЫЙ ТЕЛЕФОН: ☎
                            • № 9742
                            • UTF-8: E2 98 8E
                            • UTF-16: 26 0E
                            • U + 2614 ЗОНТИК с каплями дождя:
                              • № 9748
                              • UTF-8: E2 98 94
                              • UTF-16: 26 14
                              • U + 263A БЕЛОЕ УЛЫБАЮЩЕЕ ЛИЦО: ☺
                                • № 9786
                                • UTF-8: E2 98 BA
                                • UTF-16: 26 3А
                                • U + 2691 ЧЕРНЫЙ ФЛАГ: ⚑
                                  • № 9873
                                  • UTF-8: E2 9A 91
                                  • UTF-16: 26 91
                                  • U + 269B СИМВОЛ АТОМА: ⚛
                                    • № 9883
                                    • UTF-8: E2 9A 9B
                                    • UTF-16: 26 9B
                                    • U + 2708 САМОЛЕТ: ✈
                                      • № 9992
                                      • UTF-8: E2 9C 88
                                      • UTF-16: 27 08
                                      • U + 271E БЕЛОГО ЛАТИНСКОГО КРЕСТА:
                                        • № 10014
                                        • UTF-8: E2 9C 9E
                                        • UTF-16: 27 1E
                                        • U + 3020 ПОЧТА МАРКА ЛИЦА: 〠
                                          • № 12320
                                          • UTF-8: E3 80 A0
                                          • UTF-16: 30 20
                                          • U + 8089 CJK UNIFIED IDEOGRAPH-8089: 肉
                                            • №: 32905
                                            • UTF-8: E8 82 89
                                            • UTF-16: 80 89
                                              • U + 1F4A9 КУКЛА ПОО:
                                                • №: 128169
                                                • UTF-8: F0 9F 92 A9
                                                • UTF-16: D8 3D DC A9
                                                • U + 1F680 РАКЕТА:
                                                  • № 128640
                                                  • UTF-8: F0 9F 9A 80
                                                  • UTF-16: D8 3D DE 80
                                                  Читайте также:  Прога для увеличения скорости интернета

                                                  UNICODE – это кодировка символов, в которой задаётся кодовая страница и код символа в этой кодовой странице.

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

                                                  UTF-8 использует переменную размерность символов, и отличается тем, что все символы ASCII (диапазон 0-127 дес. , кодовая страница UNICODE #0) в ней пердставлены так же, как в самом ASCII, т. е. одним байтом. ASCII отличается от остальных наличием 0 в старшем бите.
                                                  Другие (не-ASCII) кодовые страницы в UTF-8 могут занимать 2, 3 или 4 байта на символ, при этом в старшем бите всегда наодится 1, а следующие по старшинству 2 бита определяют общий размер символа.

                                                  UTF-16 использует 16-битные "слова", но в ней на символ может приходиться как 1 "слово" (16 бит на символ, используется для буквенных языков) так и 2 "слова" (32 бит на символ, используется для иероглифических языков)

                                                  Leave a Reply

                                                  Ваш адрес email не будет опубликован. Обязательные поля помечены *

                                                  You may use these HTML tags and attributes:

                                                  <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>