Почему создатели систем Windows и Linux выбрали различные способы поддерживать Unicode?

Насколько я знаю, что Linux выбрал обратную совместимость UTF-8, тогда как Windows добавил абсолютно новые API-функции для UTF-16 (заканчивающийся "W"). Эти решения могли отличаться? Какой оказался лучше?

6
задан Michal Czardybon 28 May 2010 в 11:12
поделиться

2 ответа

UTF-16 - это практически проигрыш, худший из двух миров. Он не является ни компактным (для типичного случая символов ASCII), ни отображает каждую кодовую единицу на символ. Это еще никого сильно не задело, поскольку символы за пределами базовой многоязычной плоскости все еще редко используются, но это, конечно, уродливо.

POSIX (Linux и др.) имеет некоторые w API, основанные на типе wchar_t. На платформах, отличных от Windows, это обычно соответствует UTF-32, а не UTF-16. Что хорошо для простого манипулирования строками, но невероятно раздуто.

Но API in-memory не так уж важны. Гораздо больше трудностей возникает при хранении файлов и в протоколах on-the-wire, когда данными обмениваются приложения с разными кодировками.

Здесь компактность побеждает простоту индексации; UTF-8, как показывает практика, является лучшим форматом для этого, и слабая поддержка UTF-8 в Windows вызывает реальные трудности. Windows - последняя современная операционная система, в которой до сих пор по умолчанию используются локальные кодировки; все остальные перешли на UTF-8 по умолчанию.

Хотя я очень надеюсь, что Microsoft пересмотрит это в будущих версиях, поскольку это создает огромные и ненужные проблемы даже в мире только Windows, понятно, как это произошло.

В старые времена, когда разрабатывалась WinNT, считалось, что UCS-2 - это оно для Юникода. Не должно было быть ничего за пределами 16-битного диапазона символов. Все будут использовать UCS-2 в памяти, и, естественно, проще всего было бы сохранять это содержимое непосредственно из памяти. Вот почему Windows назвала этот формат "Unicode", и по сей день называет UTF-16LE просто "Unicode" в пользовательском интерфейсе, например, в окнах сохранения, несмотря на то, что это совершенно неверно.

UTF-8 даже не был стандартизирован до Unicode 2.0 (вместе с расширенным диапазоном символов и суррогатами, которые сделали UTF-16 тем, чем он является сегодня). К тому времени Microsoft уже перешла на WinNT4, и тогда было слишком поздно менять стратегию. Короче говоря, Microsoft не повезло, что она разрабатывала новую ОС с нуля примерно в то время, когда Юникод находился в зачаточном состоянии.

11
ответ дан 8 December 2019 в 14:41
поделиться

Windows решила поддерживать Юникод с UTF-16 и сопутствующими функциями Ascii/Unicode еще в начале 90-х (Windows NT 3.1 вышла в 1993 году), до того, как в Linux появилось понятие о поддержке Юникода.

Linux смог перенять передовой опыт, созданный на Windows и других платформах с поддержкой Unicode.

Сегодня многие согласятся, что UTF-8 является лучшей кодировкой по соображениям размера, если только вы не знаете, что будете иметь дело с большим количеством двухбайтовых символов - исключительно - где UTF-16 занимает больше места.

5
ответ дан 8 December 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: