Этот ответ просто отвечает на ваши (небольшие) вопросы, но я действительно рекомендую вам прочитать Абсолютный минимум для каждого разработчика программного обеспечения Абсолютно, положительно необходимо знать о Unicode и наборах символов (без оправданий!) , чтобы получить более широкая картина.
Ему 15 лет, но основы не меняются, и это дает хорошее объяснение истории, технических особенностей и истории этого. Это, безусловно, помогает объяснить некоторые проблемы, с которыми вы будете сталкиваться на практике при разработке веб-приложений с помощью Unicode, и поможет вам в настройке хороших тестовых случаев, чтобы ваше программное обеспечение не сломалось внезапно, когда французское или Японец начинает его использовать. В конце концов, если вы начнете использовать юникод, вам придется делать это правильно, от базы данных до заголовков кодировки.
Тем не менее ...
Старшие биты
Старшие биты - это биты, обычно записываемые с левой стороны, которые представляют наибольшую часть значения. Так же, как когда вы пишете 1857824, 1 - это самая высокая цифра (представляющая миллион). Для двоичного кода это то же самое, за исключением того, что эти числа всегда будут только 0 или 1.
Сигнальные биты
В юникоде вместо использования всех битов для значения символа (допускается 256 различных символов в байте), он использует меньшее количество битов и использует некоторые биты, чтобы сигнализировать, что следующий байт содержит больше информации о том же самом персонаж. Эти сигнальные биты находятся на верхней стороне (спереди).
Подгонка символов в 2 или 3 байта
Если у вас есть только текст на английском языке, каждый символ будет по-прежнему помещаться в один байт в UTF-8, и сигнальный бит будет указывать, что второго символа нет. Если вы смешаете это время от времени с латинским символом с диакритическими знаками, некоторые символы будут иметь размер 2 байта, но многие все равно будут одним, поэтому он все еще более компактен, чем UTF-16, который всегда кратен 2 как количество байтов.
Это означает, что UTF-16 требует меньше флагов (1 бит в 16 вместо 1 в 8), чтобы указать, будет ли больше групп. Таким образом, UTF-16 имеет больше места для данных персонажа. Это приводит к интересному эффекту для вашего «Japansese a», который также умещается в 2 байта в UTF-16, тогда как в UTF-8 вам нужно 3 байта, потому что используется слишком много сигнальных битов, и нет места для размещения Японский в 2 байта вместе со всеми другими наборами символов.
Это означает, что если вы действительно беспокоитесь о пространстве, вы можете подумать о сохранении и отправке преимущественно японских текстов в UTF-16, в то же время сохраняя и отправляя преимущественно латинские тексты (включая английский) в UTF-8. На самом деле, я бы не стал сильно беспокоиться об этом и избавил бы себя от множества неприятностей, выбрав одну и придерживаясь ее.