ASCII - это 7-битное кодирование, в котором существует соотношение 1: 1 между кодом символа и сохраняемым байтом.
CP852 , CP1250 и другие использовали дополнительный бит (по сравнению с ASCII), поэтому они имеют 128 дополнительных значений для кодирования дополнительных символов. Они могут переопределить некоторые из более низких 128 значений. Между символом и байтом сохраняется отношение 1: 1, например: если он не помещается в байт, он не может быть в этой кодовой странице (поэтому их так много).
UTF-8 и UTF-16 очень разные. Они принадлежат к набору символов Unicode, который присваивает уникальные номера любому символу из любого языка (настоящего или древнего - даже иероглифы имеют свой собственный набор значений ). Значения Unicode (кодовые точки) не ограничиваются тем, что вписывается в некоторое количество битов, так как это является задачей кодирования: UTF-8 использует 8-битные единицы (также известные как байты) и (для английского языка) в основном использует один байт на символ, но может использовать до шести при необходимости. UTF-16 использует 16-битные блоки и может потребоваться два из них для кодирования конкретной кодовой точки.
Таким образом, нет допустимого символа (как определено в Юникоде), который не может быть закодирован в UTF-16, хотя для символов с более высокими значениями могут потребоваться две 16-разрядные единицы («суррогатная пара»).
C # (на самом деле .Net) использует 16-битный тип данных char
, поэтому фактически использует UTF-16 для внутреннего использования.
См. Для получения дополнительной информации: Абсолютный минимум каждый разработчик программного обеспечения Абсолютно, положительно должен знать о Unicode и наборы символов