Текстовые кодировки — что должен знать каждый инженер-программист
Мы знаем, что компьютеры понимают двоичный код, который похож на 010101.
Если я скажу «Привет, мир 123» Компьютер произнесет ту же строку, что и
«01001000 01100101 01111001 00100000 00110001 00110010 00110011»
На английском это А а на языке компьютера (двоичном) это «01000001»
Так же, Б является «01001000» в двоичном формате. Нули и единицы называются битами. Бит может быть равен 0 или 1.
Определение — Кодирование означает преобразование данных в закодированную форму.
Предположим, у нас есть строка «Привет, мир». Теперь, чтобы сохранить/передать эти данные, их необходимо закодированный используя какую-то схему кодирования, чтобы компьютеры могли ее получать/отправлять/читать/записывать. Существует множество схем кодирования, и мы обсудим несколько важных из них в этом сообщении блога.
Когда-то компьютерные программы были запрограммированы так, чтобы понимать только английский язык (от a до z, от A до Z), от 0 до 9, некоторые знаки препинания и множество других символов, таких как пробел, возврат, возврат и т. д. Всего таких символов 128. персонажи. Это называлось Набор символов ASCII. Они были закодированы с помощью ASCII-кодирование схема.
Набор символов
По сути, это список символов, которые могут быть сформированы с использованием определенной схемы кодирования. Например, ниже приведена таблица набора символов ASCII.
Представление битов (с использованием кодировки ASCII) | Ценность |
---|---|
01000001 | А |
01000010 | Б |
01000011 | С |
01000100 | Д |
01000101 | Е |
01000110 | Ф |
…122 Подробнее |
Все выглядело хорошо, пока Интернационализация Интернета, и он стал набирать популярность не только в Америке, но и в других странах. Люди хотели пользоваться Интернетом на своих родных языках, но Набор символов ASCII не предоставляет символы на других языках.
Если бы кто-то отправил вам электронное письмо в то время на французском языке, в котором говорится
C'est génial
вы, вероятно, получили быC'est g�nial
потому что кодировка ASCII не понимает букву акцентаé
так как он не может его закодировать.
Но почему ASCII не понимает эти другие символы?
Если это спецификация, то почему мы не можем ее расширить?
Хотя кодировка ASCII представляет каждый символ в своем наборе символов с помощью 8 бит. Он использует только первые 7 бит. [See the table above] Последний бит всегда равен 0.
2^7 = 128
(Общее количество поддерживаемых символов в ASCII)
И это все. ASCII не может поддерживать больше символов, чем это.
2^8 = 256
(Общее количество символов, которое может поддерживаться 8 битами)
Это дало разработчикам возможность расширить набор символов и поддерживать больше
символы других языков.
Одно было точно, что 8 бит (1 байт) недостаточно для поддержки всех языков на планете. Тем временем появились и другие схемы кодирования, использующие более одного байта для представления символов из разных языков, таких как китайский, хинди, латынь и т. д.
Юникод
Затем появился Unicode, который объединил все различные представления символов. Юникод может представлять практически любой символ, о котором вы только могли подумать.
Итак, первое, что приходит на ум, это то, что он может использовать около 32 бит (4 байта) для представления каждого из своих символов, и это может быть причиной того, что он может поддерживать так много символов. Но это не так. На самом деле он не использует байты для представления символов. Это не обязательно. Он использует что-то известное как кодовые точки.
Кодовые очки
Кодовые точки — это в основном сопоставление чисел с символами, и эти числа называются кодовыми точками.
Кодовая точка | Ценность |
---|---|
49 | 1 |
… | |
65 | А |
66 | Б |
67 | С |
… | |
1245 | жї |
9731 | ☃ |
Теперь, когда я сказал Юникод не должен использовать байты для представления своих символов. я имел в виду, что Unicode на самом деле не является схемой кодирования.
Юникод — это просто абстрактный способ представления символов. Это не кодировка.
Существуют и другие способы кодирования этих кодовых точек Unicode в биты (для сохранения на диске или в памяти) и Unicode не дает решения для этого. К счастью, у нас есть схемы кодирования для кодирования представления символов Unicode.
Unicode — это большая таблица, отображающая символы в числа и различные кодировки UTF.
кодировки определяют, как эти числа кодируются как биты.
Но почему мы не можем просто использовать 4 байта для представления каждого символа?
Мы сможем поддерживать 4 294 967 296 символов, и это все, что нам нужно.
4 bytes = 32 bits
2^32 = 4,294,967,296
Проблема связана с хранением.
Для хранения простого символа «А» с использованием кодировки ASCII (1-байтовая кодировка) нам нужно 8 бит памяти, т.е. «01000001». Если мы хотим сохранить этот блог, используя ASCII, до этого момента нам потребуется около 30620 бит, т.е. 3827 байт.
Для хранения простого символа «А» с использованием 4-байтовой кодировки нам нужно 32 бита памяти, т.е. «00000000 00000000 00000000 01000001». Если мы хотим сохранить этот блог, используя 4-байтовую кодировку, до этого момента нам потребуется приблизительно 161 666 бит, т.е. 16 166 байт.
Это 4 раза размер, необходимый для ASCII. Вот почему нам нужен эффективный способ кодирования этих точек юникода без потери памяти.
UTF-8 и UTF-16
Существует несколько способов кодирования кодовых точек Unicode в биты. UTF-32 это один из таких способов, который хранит каждую кодовую точку, используя 4 байта и мы только что прочитали, почему это неэффективный способ хранения этих символов. UTF-8 а также UTF-16 два других таких способа.
Но UTF-8 и UTF-16 особенные, поскольку это кодировки переменной длины. Если кодовая точка может быть сохранена с использованием одного байта, она будет сохранена с использованием одного байта, а если для кодовой точки требуется 2 байта, она будет закодирована с использованием 2 байтов.
UTF-8 и UTF-16 используют то, что называется сигнальными битами, чтобы определить, закодирована ли кодовая точка с использованием более
один байт. Последний бит (8-й бит) байта используется в качестве сигнала, чтобы определить, использует ли он другой байт для кодирования того же символа.
Это эффективный способ кодирования, если учитывать только размер хранилища. Но слишком частое чтение и обработка битов сигнала иногда может повлиять на производительность, если данные большие. Это обсуждение для другого дня.
Давайте посмотрим на некоторые различия между UTF-8 и UTF-16.
Кодирование | Минимальный номер байтов | Максимальное количество байтов | Количество байтов, доступных для использования |
---|---|---|---|
UTF-8 | 1 | 4 | 1,2,3 и 4 |
UTF-16 | 2 | 4 | 2 и 4 |
UTF-32 | 4 | 4 | 4 |
Кодовые точки Unicode записываются в шестнадцатеричном формате, перед которым ставится «У+» например, A записывается как «U+0041» это шестнадцатеричный способ записи 65.
Первые 128 символов в UTF-8 точно такие же, как и в наборе символов ASCII. Даже их представление битов точно такое же, что обеспечивает обратную совместимость UTF-8 с ASCII.