Когда мы читаем текст, нам кажется, что есть только один способ хранения текста в памяти — в виде букв (почему нет? :)). На самом деле существует множество кодировок, в которых текст может храниться и обрабатываться cpu. И далее я вкратце опишу самые распространенные из них:
ASCII
ASCII — это однобайтовая кодировка, где первые 128 символов — это управляющие символы (табы, переносы, символы заголовков. некоторые из них используются только в бинарных файлах) и латинские символы. После 128 символа могут быть символы «расширенного ASCII» (как например, Windows-1251, KOI8-R, CP866) — такие кодировки называют ASCII-совместимыми. Однако, в связи с тем, что представление классической ASCII (символы которой умещаются в 7 бит) может несколько отличаться при отображении в памяти при отсутствии расширяемых символом, то даже для латыни требуется специальная конвертация для перевода из ASCII кодировки в расширенную и наоборот.
Интересное: CP-866 — это дефолтная кодировка консоли в Windows.
UNICODE
Unicode — это другая кодировка, которая появилась после ASCII. Коды в стандарте Юникод разделены на несколько областей. Область с кодами от U+0000 до U+007F содержит символы набора ASCII, и коды этих символов совпадают с их кодами в ASCII. Далее расположены области символов других систем письменности.
Первая версия Юникода (1991 г.) представляла собой 16-битную кодировку с фиксированной шириной символа; общее число разных символов было 216 (65 536). Сейчас же юникод имеет несколько форм представления: UTF-8, UTF-16 (UTF-16BE, UTF-16LE) и UTF-32 (UTF-32BE, UTF-32LE), где размер 1 символа может варьироваться.
UTF-8
UTF-8 — представление Юникода, обеспечивающее наибольшую компактность и обратную совместимость с 7-битной системой ASCII; текст, состоящий только из символов с номерами меньше 128, при записи в UTF-8 превращается в обычный текст ASCII и может быть отображён любой программой, работающей с ASCII; и наоборот, текст, закодированный 7-битной ASCII может быть отображён программой, предназначенной для работы с UTF-8. Остальные символы Юникода изображаются последовательностями длиной от 2 до 4 байт, в которых первый байт всегда имеет маску 11xxxxxx
, а остальные — 10xxxxxx
. В UTF-8 не используются суррогатные пары. Итого размер симола utf8 варьируется от 1 до 4 байт (то есть 1, 2, 3 или 4 байт). Является сегодня де-факто стандартом в web.
UTF-16
В UTF-16 символы кодируются двухбайтовыми словами с использованием всех возможных диапазонов значений (от 0 до FFFF16). При этом можно кодировать символы Unicode в диапазонах 000016..D7FF16 и E00016..10FFFF16. Исключенный отсюда диапазон D80016..DFFF16 используется как раз для кодирования так называемых суррогатных пар — символов, которые кодируются двумя 16-битными словами. Итого в UTF-16 занимает либо 2 либо 4 байта. Является базовой кодировкой в .NET.
UTF-32
UTF-32 — способ представления Юникода, при котором каждый символ занимает ровно 4 байта. Главное преимущество UTF-32 перед кодировками переменной длины заключается в том, что символы Юникод в ней непосредственно индексируемы, поэтому найти символ по номеру его позиции в файле можно чрезвычайно быстро, и получение любого символа n-й позиции при этом является операцией, занимающей всегда одинаковое время. Это также делает замену символов в строках UTF-32 очень простой. Напротив, кодировки с переменной длиной требуют последовательного доступа к символу n-й позиции, что может быть очень затратной по времени операцией. Главный недостаток UTF-32 — это неэффективное использование пространства, так как для хранения любого символа используется четыре байта. Используется python для Linux систем.
UTF-7
UTF-7 — довольно интересный формат, не водящий в спецификацию Unicode. Дословано — 7-bit Unicode Transformation Format — «формат преобразования Юникода, 7 бит». Разработан как альтернатива base64 для кодирования управляемых символов, знаков препинания и прочих символов за пределами ascii. В основном используется для передачи сообщений в электронной почте. Хотя MIME позволяет кодировать тело сообщения из разных наборов символов (более широких, чем ASCII), базовая инфраструктура передачи (SMTP, основной стандарт передачи E-mail) по-прежнему не гарантирует 8-битную чистоту. В отличие от base64, которая кодирует каждый байт отдельно, UTF-7 кодирует непосредственно юникод символы. UTF-7 стало хорошей альтернативой для base64 в плане чтения записи, поскольку позволяет быстрее кодировать и декодировать различные формы представления юникод, нежели base64, однако один символ может занимать от 6 до 12 байт.
Итак, теперь вы познакомились с наиболее популярными кодировками. Знание их отличительных особенностей пригодятся в любой сфере программирования. И если хотите — эту статью можете добавить себе в закладки :). Я не против.