(Обратите внимание, что я использую некоторые из этих терминов свободно / разговорно для более простого объяснения, которое по-прежнему попадает в ключевые моменты.)
Байт может содержать только 256 различных значений, составляющих 8 бит.
Поскольку в наборе символов есть наборы символов, содержащие более 256 символов, в общем случае нельзя сказать, что каждый символ является байтом.
Следовательно, должны быть отображения, описывающие, как превратите каждый символ в набор символов в последовательность байтов. Некоторые символы могут быть сопоставлены одному байту, но другие должны быть сопоставлены с несколькими байтами.
Эти сопоставления являются кодировками, потому что они сообщают вам, как кодировать символы в последовательности байтов.
Что касается Unicode, на очень высоком уровне Unicode является попыткой присвоить каждому уникальному номеру уникальный номер. Очевидно, что это число должно быть чем-то большим, чем байт, так как имеется более 256 символов :) Java использует версию Unicode, где каждому символу назначается 16-битное значение (и поэтому символы Java имеют ширину 16 бит и имеют целочисленные значения от 0 до 65535). Когда вы получаете представление байта символа Java, вы должны указать JVM кодировку, которую вы хотите использовать, чтобы она знала, как выбрать последовательность байтов для символа.