UTF-16 - в значительной степени потеря, худшая из двух миров. Он не является компактным (для типичного случая символов ASCII) и не отображает каждую единицу кода на символ. На самом деле это никого не сильно укусило, поскольку персонажи вне Базовой многоязычной плоскости по-прежнему используются редко, но это ужасно.
POSIX (Linux et al) также имеет некоторые API w
, основанные на типе wchar_t
. На платформах, отличных от Windows, это обычно соответствует UTF-32, а не UTF-16. Который хорош для легкой манипуляции со струнами, но невероятно раздут.
Но API в памяти не так уж важны. Гораздо более сложная задача - хранение файлов и протоколы «по проводам», когда данные обмениваются между приложениями с разными традициями кодировки.
Здесь компактность превосходит простоту индексации; UTF-8 однозначно является лучшим форматом для этого, и слабая поддержка UTF-8 в Windows вызывает реальные трудности. Windows - последняя современная операционная система, которая все еще имеет специфичные для локали кодировки по умолчанию; все остальные перешли на UTF-8 по умолчанию.
Хотя я серьезно надеюсь, что Microsoft пересмотрит это для будущих версий, так как это вызывает огромные и ненужные проблемы даже в мире только для Windows, понятно, как это произошло.
В старые времена, когда разрабатывался WinNT, мы думали, что UCS-2 это для Unicode. Там не будет ничего за пределами 16-битного диапазона символов. Каждый будет использовать UCS-2 в памяти, и, естественно, будет проще сохранить этот контент прямо из памяти. Вот почему Windows называет этот формат «Unicode», и до сих пор до сих пор называет UTF-16LE просто «Unicode» в пользовательском интерфейсе, как блоки сохранения, несмотря на то, что он полностью вводит в заблуждение.
UTF-8 даже не был стандартизирован до Unicode 2.0 (наряду с расширенным диапазоном символов и суррогатами, которые сделали UTF-16 тем, чем он является сегодня). К тому времени Microsoft перешла на WinNT4, и было уже слишком поздно менять стратегию. Короче говоря, Microsoft не повезло с нуля разрабатывать новую ОС в то время, когда Unicode только начинал развиваться.