Чтобы расширить ответы, которые дали другие:
У нас есть много языков с большим количеством символов, которые в идеале должны отображать компьютеры. Юникод присваивает каждому символу уникальный номер или кодовую точку.
Компьютеры имеют дело с такими числами, как байты ... пропуская здесь немного истории и игнорируя проблемы адресации памяти, 8-битные компьютеры будут рассматривать 8-битный байт как самую большую числовую единицу, легко представленную на аппаратном уровне, 16-битную компьютеры расширили бы это до двух байтов и т. д.
Старые кодировки символов, такие как ASCII, относятся к (до) 8-битной эре и пытаются втиснуть доминирующий язык в вычислениях того времени, то есть в английский, в числа в диапазоне от 0 до 127 (7 бит). С 26 буквами в алфавите, как в заглавной, так и в заглавной форме, цифры и знаки препинания работали довольно хорошо. ASCII расширился на 8 бит для других неанглийских языков, но дополнительные 128 цифр / кодовых точек, предоставляемые этим расширением, будут отображаться на разные символы в зависимости от отображаемого языка. Стандарты ISO-8859 являются наиболее распространенными формами этого картирования; ISO-8859-1 и ISO-8859-15 (также известные как ISO-Latin-1, latin1, и да, есть также две разные версии стандарта ISO 8859).
Но этого недостаточно, если вы хотите представлять символы из более чем одного языка, поэтому объединение всех доступных символов в один байт просто не будет работать.
Существуют два разных типа кодирования: один расширяет диапазон значений, добавляя больше битов. Примерами этих кодировок могут быть UCS2 (2 байта = 16 бит) и UCS4 (4 байта = 32 бита). Они по своей природе страдают от той же проблемы, что и стандарты ASCII и ISO-8859, поскольку их диапазон значений по-прежнему ограничен, даже если этот предел значительно выше.
В другом типе кодирования используется переменное число байтов на символ, и наиболее распространенными кодировками для этого являются кодировки UTF. Все кодировки UTF работают примерно одинаково: вы выбираете размер блока, который для UTF-8 составляет 8 бит, для UTF-16 - 16 бит, а для UTF-32 - 32 бита. Затем стандарт определяет некоторые из этих битов как флаги: если они установлены, то следующий блок в последовательности блоков должен считаться частью того же символа. Если они не установлены, эта единица полностью представляет один символ. Таким образом, наиболее распространенные (английские) символы занимают только один байт в UTF-8 (два в UTF-16, 4 в UTF-32), но символы других языков могут занимать шесть или более байтов.
Многобайтовые кодировки (я должен сказать, несколько единиц после приведенного выше объяснения) имеют преимущество в том, что они относительно экономичны, но недостатком является то, что такие операции, как поиск подстрок, сравнения и т. Д., Все должны декодировать символы кодировать точки в кодировке Юникод до того, как такие операции могут быть выполнены (хотя есть некоторые сочетания клавиш).
Как стандарты UCS, так и стандарты UTF кодируют кодовые точки, как определено в Unicode. Теоретически, эти кодировки могут быть использованы для кодирования любого числа (в пределах диапазона, поддерживаемого кодировкой), но, конечно, эти кодировки были сделаны для кодирования кодовых точек Unicode. И это ваши отношения между ними.
Windows обрабатывает так называемые строки "Юникод" как строки UTF-16, в то время как большинство UNIX-систем по умолчанию используют UTF-8 в наши дни. Протоколы связи, такие как HTTP, как правило, лучше всего работают с UTF-8, поскольку размер блока в UTF-8 такой же, как в ASCII, и большинство таких протоколов были разработаны в эпоху ASCII. С другой стороны, UTF-16 обеспечивает наилучшую среднюю производительность пространства / обработки при представлении всех живых языков.
Стандарт Unicode определяет меньше кодовых точек, чем может быть представлено в 32 битах. Таким образом, для всех практических целей UTF-32 и UCS4 стали одной и той же кодировкой, поскольку вам вряд ли придется иметь дело с многозначными символами в UTF-32.
Надеюсь, что заполнит некоторые детали.