## Стандарты кодировки данных

1. [Как работают кодировки?](https://www.youtube.com/watch?v=4MFcmreAUhs)

#### ASCII (American standard code for information interchange)

ASCII — это таблица кодировки символов, в которой каждой букве, числу или знаку соответствует определенное число. В стандартной таблице ASCII 128 символов, пронумерованных от 0 до 127. В них входят латинские буквы, цифры, знаки препинания и управляющие символы. 



Однако, 128 символов это 2^7, но почему тогда 8 бит это один байт? 
Нижнюю половину кодовой таблицы (0—127) занимают символы ASCII, а верхнюю (128—255) — [кодовая страница, ASCII](https://ru.wikipedia.org/wiki/Кодовая_страница) - дополнительные символы, включая набор национальных символов.  

![ascii](/pictures/Concurrency/ascii.png?raw=true)

> RTFM (Read The Fucking Manual) man ascii

![ASCII](https://blog.skillfactory.ru/wp-content/uploads/2023/03/image-52-2048x1425.png)

Каждая страна добовляла кодовую страницу как хотела, что создавало много     неудобств как для пользователей, так и для программистов. При попытке прочесть текстовый файл при помощи кодовой страницы, несовместимой с той в которой он был создан, возникают кракозябры. В последние годы получил широкое распространение Unicode как альтернатива традиционным [кодовым страницам](https://ru.wikipedia.org/wiki/Кодовая_страница).

#### Юникод

Юникод является самым распространенным стандартом в Сети, который позволяет хранить информацию всех языков человечества и вообще любого символа, который когда-либо использовался, включая эмотиконы, содержащий любой символ. Его понимают большинство компьютеров на планете и носители основных мировых языков. Юникод хранит результаты преобразования информации, выполненного через систему кодирования UTF-8, UTF-16 или UTF-32. Типы String и Character в Swift полностью совместимы с Юникодом

> RTFM (Read The Fucking Manual) man unicode

Unicode можно рассматривать как «продолжение», расширение ASCII. Первые 128 символов в «Юникоде» кодируются так же, как в ASCII, и это те же самые символы.
Что обеспечивает наибольшую компактность и обратную совместимость с 7-битной системой ASCII.

#### Стандарты хранения Юникода

1. [UTF-8 vs UTF-16](https://habr.com/ru/articles/544084/)

UTF(Unicode transformation format)-8/16 — две самые широко используемые кодировки в стандарте Unicode. Они обе обладают переменной длинной кодирования.

* UTF-8 (минимальное кол-во бит - 8 ) - данные требуют двух байтов, то и в UTF-8 они будут весить два байта. UTF-8 кодирует символ в двоичную строку от одного до четырех байтов. Так, для шифрования латинских символов достаточно одного байта, а для кириллических — двух. Swift 5 и более поздние версии используют только кодировку хранения UTF-8.

Чтобы компьютера понимал сколько байт нужно считывать, в старшие разряды помещаются специальные метки (0, 10, 110, 1110, 11110): 

![UTF-8](/pictures/Concurrency/UTF-8.png?raw=true)

* UTF-16 (минимальное кол-во бит - 16) оперирует данными из двух и четырех байт. Кодировка подходит для восточных языков. До версии Swift 4.2 Swift использовал UTF-16 в качестве предпочтительной кодировки. Но поскольку UTF-16 не совместима с ASCII, у String было две кодировки хранения: одна для ASCII, другая для UTF-16.

В UTF-16 не используются маски внутри байтов, вместо этого перед байтом добавляется двухбайтовое число - BOM (Unicode byte order mark):

![BOM bytes](/pictures/Concurrency/BOMbytes.png?raw=true) 

---

[3.1.1.1 Memory Theme](./3.1.1.1%20Memory.md) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [3.1.2 RandomAccessMemory (RAM) Theme Folder](../3.1.2%20RandomAccessMemory/)