Introduction to Unicode and UTF-8

Unicode is an industry standard for consistent encoding of written text. Learn the basics and most important parts of it, in particular concerning UTF-8

Юникод - этоотраслевой стандарт последовательного кодирования письменного текста.

Есть много наборов символов, которые используются компьютерами, но Unicode является первым в своем роде, нацеленным на поддержку каждого письменного языка на Земле (и за его пределами!).

Его цель - предоставить уникальный номер для идентификации каждого символа для каждого языка на любой платформе.

Unicode сопоставляет каждый символ с определенным кодом, который называетсякодовая точка. Кодовая точка принимает формуU+<hex-code>, начиная сU+0000кU+10FFFF.

Пример кода выглядит так:U+004F. Его значение зависит от используемой кодировки символов.

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

UTF-8 определенно является самой популярной кодировкой в семействе Unicode, особенно в Интернете. Этот документ написан, например, в UTF-8.

В настоящее время реализовано более 135 000 различных символов с местом для более чем 1,1 миллиона.

Скрипты

Все символы, поддерживаемые Unicode, сгруппированы в разделы, называемыескрипты.

Для каждого набора символов существует сценарий:

  • Латинский (содержит все символы ASCII + все остальные символы западного мира)
  • Корейский
  • Древневенгерский
  • иврит
  • Греческий
  • Армянский
  • …и так далее!

Полный список определен вСтандарт ISO 15924.

Подробнее о скриптах:https://en.wikipedia.org/wiki/Script_(Unicode)

Самолеты

Помимо скриптов, есть еще один способ организации символов Unicode:самолеты.

Вместо того, чтобы группировать их по типу, он проверяет значение кодовой точки:

Самолет Классифицировать
0 U + 0000 - U + FFFF
1 U + 10000 - U + 1FFFF
2 U + 20000 - U + 2FFFF
14 U + E0000 - U + EFFFF
15 U + F0000 - U + FFFFF
16 U + 100000 - U + 10FFFF

Всего 17 самолетов.

Первый особенный, он называетсяБазовая многоязычная плоскость, или жеBMP, и содержит большинство современных знаков и символов из латинского, кириллического и греческого шрифтов.

Остальные 16 самолетов называютсяастральные планы. Стоит отметить, что самолеты с 3 по 13 в настоящее время пустуют.

Кодовые точки, содержащиеся в астральных планах, называютсяастральные кодовые точки.

Все точки астрального кода выше, чемU+10000.

Единицы кода

Кодовые точки хранятся внутри каккодовые единицы. Единица кода - это битовое представление символа, длина которого зависит от кодировки символа.

UTF-32 использует 32-битную кодовую единицу.

UTF-8 использует 8-битную кодовую единицу, а UTF-16 использует 16-битную кодовую единицу. Если для кодовой точки требуется больший размер, она будет представлена двумя (или более в UTF-8) кодовыми единицами.

Графемы

Графема - это символ, который представляет собой единицу системы письма. Это в основномтвоя идеяперсонажа и как он должен выглядеть.

Глифы

Глиф - это графическое представление графемы: то, как она визуально отображается на экране, фактический вид на дисплее.

Последовательности

Юникод позволяет комбинировать разные символы для формирования графемы.

Например, это случай с диакритическими знаками: букваéможно выразить комбинацией буквe(U+0065) и символ Юникода с именем «КОМБИНИРОВАНИЕ ОСТРЫХ АКЦЕНТОВ» (U+0301):

"U+0065U+0301" ➡️ "é"

U+0301в данном случае это то, что описывается какобъединяющий знак, один символ, который применяется к предыдущему, чтобы сформировать другую графему.

Нормализация

Иногда символы могут быть представлены с использованием различных комбинаций кодовых точек.

Например, это случай с диакритическими знаками: букваéможно выразить какU+00E9а также как комбинированиеe(U+0065) и символ Юникода с именем «КОМБИНИРОВАНИЕ ОСТРЫХ АКЦЕНТОВ» (U+0301):

U+00E9       ➡️ "é"
U+0065U+0301 ➡️ "é"

Процесс нормализации анализирует строку на предмет неоднозначности такого рода и генерирует строку с каноническим представлением любого символа.

Без нормализации абсолютно одинаковые для глаза строки будут считаться разными, потому что их внутреннее представление изменится:

Смайлики

Emojis - это символы астрального плана Unicode, и они позволяют отображать изображения на экране, не имея реальных изображений, а только глифы шрифта.

Например, символ 🐶 кодируется какU+1F436.

Первые 128 символов

Первые 128 символов Unicode совпадают с набором символов ASCII.

Первые 32 символа,U+0000-U+001F(0-31) называютсяКоды управления.

Они унаследовали от прошлого, и большинство из них уже устарели. Они использовались для телетайпов, которые существовали до факсов.

Символы от U + 0020 (32) до U + 007E (126) содержат цифры, буквы и некоторые символы:

Юникод Код ASCII Глиф
U + 0020 32 (Космос)
U + 0021 33 !
U + 0022 34 «
U + 0023 35 #
U + 0024 36 $
U + 0025 37 %
U + 0026 38 &
U + 0027 39 '
U + 0028 40 (
U + 0029 41 )
U + 002A 42 *
U + 002B 43 +
U + 002C 44 ,
U + 002D 45 -
U + 002E 46 .
U + 002F 47 /
U + 0030 48 0
U + 0031 49 1
U+0032 50 2
U+0033 51 3
U+0034 52 4
U+0035 53 5
U+0036 54 6
U+0037 55 7
U+0038 56 8
U+0039 57 9
U + 003A 58 :
U + 003B 59 ;
U + 003C 60 <
U + 003D 61 знак равно
U + 003E 62 >
U + 003F 63 ?
U+0040 64 @
U+0041 65 А
U+0042 66 B
U+0043 67 C
U+0044 68 D
U+0045 69 E
U+0046 70 F
U+0047 71 грамм
U+0048 72 ЧАС
U+0049 73 я
U + 004A 74 J
U + 004B 75 K
U + 004C 76 L
U + 004D 77 M
U + 004E 78 N
U + 004F 79 О
U+0050 80 п
U+0051 81 Q
U+0052 82 р
U+0053 83 S
U+0054 84 Т
U+0055 85 U
U+0056 86 V
U+0057 87 W
U+0058 88 Икс
U+0059 89 Y
U + 005A 90 Z
U + 005B 91 [
U + 005C 92
U + 005D 93 ]
U + 005E 94 ^
U + 005F 95 _
U+0060 96 `
U+0061 97 а
U+0062 98 б
U+0063 99 c
U+0064 100 d
U+0065 101 е
U+0066 102 ж
U+0067 103 грамм
U+0068 104 час
U+0069 105 я
U + 006A 106 j
U + 006B 107 k
U + 006C 108 л
U + 006D 109 м
U + 006E 110 п
U + 006F 111 о
U+0070 112 п
U+0071 113 q
U+0072 114 р
U+0073 115 s
U+0074 116 т
U+0075 117 ты
U+0076 118 v
U+0077 119 ш
U+0078 120 Икс
U+0079 121 y
U + 007A 122 z
U + 007B 123 {
U + 007C 124
U + 007D 125 }
U + 007E 126 ~
  • Цифры идут отU+0030кU+0039
  • Заглавные буквы идут отU+0041кU+005A
  • Строчные буквы идут отU+0061кU+007A

U + 007F (127) - символ удаления.

Все, что происходит в будущем, выходит за рамки ASCII и является исключительно частью Unicode.

Вы можете найти весь список в Википедии:https://en.wikipedia.org/wiki/List_of_Unicode_characters

Кодировки Unicode

UTF-8

UTF-8 - это кодировка символов переменной ширины, и он может кодировать каждый символ, охватываемый Unicode, используя от 1 до 4 8-битных байтов.

Первоначально он был разработан Кеном Томпсоном и Робом Пайком в 1992 году. Эти имена знакомы тем, кто хоть сколько-нибудь интересуется языком программирования Go, поскольку они также были двумя из первых создателей этого языка.

W3C рекомендует использовать ее в качестве кодировки по умолчанию в файлах HTML, а статистика показывает, что она используется на 91,3% всех веб-страниц по состоянию на апрель 2018 года.

На момент своего появления ASCII была самой популярной кодировкой символов в западном мире. В ASCII всем буквам, цифрам и символам был присвоен номер, и это число. Будучи установленным на 8 бит, он мог представлять не более 255 символов, и этого было достаточно.

UTF-8 был разработан для обратной совместимости с ASCII. Это было очень важно для его принятия, поскольку ASCII был намного старше (1963 г.) и широко распространен, а переход на UTF-8 произошел почти прозрачно.

Первые 128 символов UTF-8 точно соответствуют ASCII. Почему 128? Потому что ASCII использует 7-битную кодировку, которая допускает до 128 комбинаций. Почему 7 бит? Сейчас мы принимаем 8 бит как должное, но в те дни, когда был задуман ASCII, были популярны и 7-битные системы.

100% совместимость с ASCII делает UTF-8 очень эффективным, потому что наиболее часто используемые символы в западных языках кодируются только 1 байтом.

Вот карта использования байтов:

Количество байтов Начинать Конец
1 U+0000 U+007F
2 U+0080 U+07FF
3 U+0800 U+FFFF
4 U+10000 U+10FFFF

Помните, что в ASCII символы были закодированы как числа? Если письмоAв ASCII был представлен числом65, используя UTF-8, он закодирован какU+0041.

Почему нетU+0065ты спрашиваешь? Потому что в юникоде используется шестнадцатеричное основание, а вместо10у вас естьU+000Aи так далее (в основном у вас есть набор из 16 цифр вместо 10)

Взгляни наэто видео, который блестяще объясняет совместимость UTF-8 и ASCII.

UTF-16

UTF-16 - еще одна очень популярная кодировка Unicode. Например, так Java внутренне представляет любой символ. Это такжеодна из двух кодировок, используемых JavaScript для внутренних целей, вместе сUCS-2. Он также используется многими другими системами, такими как Windows.

UTF-16 - это система кодирования переменной длины, такая как UTF-8, но использует 2 байта (16 бит) как минимум для любого символьного представления. Таким образом, он обратно несовместим со стандартом ASCII.

Кодовые точки в базовой многоязычной плоскости (BMP) хранятся в 2 байтах. Кодовые точки вастральные планыхранятся в 4 байтах.

UTF-32

UTF-8 использует минимум 1 байт, UTF-16 использует минимум 2 байта.

UTF-32 всегда использует 4 байта без оптимизации использования пространства и, как таковой, расходует много пропускной способности.

Это ограничение ускоряет работу, потому что вам нужно меньше проверять, поскольку вы можете принять 4 байта для всех символов.

Он не так популярен, как UTF-8 и UTF-16, но у него есть свои приложения.

Скачать мою бесплатнуюРуководство для начинающих по JavaScript


Больше руководств по js: