Вопрос или проблема
Прежде чем показать сложный пример Windows 10 (в данном случае Win10.21H2), позвольте мне сначала показать простой пример на Ubuntu 22.04.
Я размещаю имена файлов с китайскими и корейскими символами на USB-флешке, подключаю ее к Ubuntu и Windows и смотрю, как они отображаются.
Ubuntu 22.04 отображает их очень хорошо.
$ la
total 196
drwxr-xr-x 5 chj chj 32768 1970-01-01 08:00:00 ./
drwxr-x---+ 3 root root 4096 2022-06-09 00:43:35 ../
drwxr-xr-x 2 chj chj 32768 2021-10-24 17:09:04 LEXAR-128G/
drwxr-xr-x 2 chj chj 32768 2022-02-17 18:30:34 Raspi-wallpaper/
drwxr-xr-x 4 chj chj 32768 2016-02-17 00:59:34 'System Volume Information'/
-rw-r--r-- 1 chj chj 23 2022-06-09 08:39:10 한국파일.txt
-rw-r--r-- 1 chj chj 17 2022-06-09 08:27:30 电脑文件.txt
Но для Windows 10 мне приходится вручную пробовать множество шрифтов (семейств шрифтов), пока не найду такой, который может их хорошо отобразить.
Для английской версии Win10 шрифт по умолчанию в CMD — это Consolas, затем я пробую Lucida Console, SimHei(黑体) и, наконец, NSimSun(新宋体).
Хотя NSimSun отображает их правильно в этом случае, я все еще не уверен, может ли NSimSun справиться с символами Unicode из других стран/кодировок (если хотя бы один шрифт, соответствующий этой стране/кодировке, установлен в системе).
Consolas:
Lucida Console:
SimHei:
NSimSun:
Сейчас 2022 год, и мне интересно, почему Microsoft так усложняет пользователю возможность правильно и удобно просматривать символы Unicode в окне CMD. Есть ли какая-то лучшая практика в этом?
Консоль Windows была создана до появления Unicode. Было принято ужасное решение представлять каждый текстовый символ как фиксированное значение длиной 16 бит (UCS-2). Поскольку UCS-2 – это кодировка фиксированной ширины 16 бит, она не может представлять все кодовые точки Unicode. GDI используется для отображения текста в консоли Windows, но GDI не поддерживает резервные шрифты, поэтому консоль Windows не может отображать глифы для кодовых точек, которые не существуют в текущем выбранном шрифте. Эта ссылка содержит оценку от эксперта Microsoft: Командная строка Windows: буфер текстового вывода Unicode и UTF-8
Мне не удалось найти действительно хорошее решение этой проблемы.
Ответ или решение
Почему так сложно правильно отображать Юникод в консоли Windows 10?
Отображение символов Юникода в консоли Windows 10 остается сложной задачей. Для объяснения проблемы следует рассмотреть несколько ключевых аспектов, касающихся архитектуры Windows, устаревших решений и отсутствия поддержки необходимых функций.
1. Устаревшая архитектура
Консоль Windows была разработана до появления стандарта Юникод. Изначально для её работы использовалась фиксированная длина символов в 16 бит (UCS-2). Это решение серьезно ограничивает возможности, так как UCS-2 не способен отобразить все коды символов Юникода. В результате, символы, которые не входят в этот диапазон, просто не могут быть правильно отображены.
2. Ограничения GDI
Для рендеринга текста в консоли используется Graphics Device Interface (GDI). Однако GDI не поддерживает механизм подмены шрифтов, что приводит к тому, что консоль не может отображать символы, для которых отсутствуют глифы в текущем выбранном шрифте. Если шрифт, установленных в системе, не содержит символов для конкретной кодировки, никаких альтернативных вариантов просто не существует.
3. Выбор шрифта
В отличие от Ubuntu, которая поддерживает множество шрифтов и автоматически подбирает их в зависимости от загружаемых символов, пользователям Windows 10 приходится вручную перебирать несколько шрифтов. Даже если шрифт NSimSun может отобразить нужные символы, пользователи не могут быть уверены, что он поддерживает все возможные Юникодные символы из других языков и наборов символов. Это создает дополнительное бремя для конечного пользователя, который должен самостоятельно находить »работающие» решения.
4. Отсутствие стандартизации
Даже в условиях однообразных стандартов, каждая версия Windows может иметь свои собственные ограничения. Например, предустановленные шрифты, настройки региональной локализации и кодировка по умолчанию могут различаться. Это дополнительно усугубляет проблему: даже если один и тот же шрифт используется на различных системах, его поведение может отличаться.
5. Возможные решения
Несмотря на указанные сложности, существуют несколько подходов к улучшению отображения Юникода в консоли Windows 10:
-
Использование новых терминальных приложений. Microsoft предоставляет новое приложение Windows Terminal, которое предлагает гораздо более богатые возможности для отображения Юникода и графики. Этот терминал поддерживает современные кодировки, шрифты и множество других функций.
-
Изменение кодировки консоли. Пользователи могут попытаться установить кодировку UTF-8 (с помощью команды
chcp 65001
), что может улучшить ситуацию с отображением определенных символов. -
Настройка шрифтов. Рекомендуется использовать шрифты, которые имеют самое полное покрытие символов, такие как "DejaVu Sans Mono" или "Noto Sans Mono", так как они разработаны специально для работы с многоязычными текстами и имеют хорошую поддержку Юникода.
Заключение
Хотя Windows 10 предлагает определенные возможности для работы с Юникодом, все еще присутствуют значительные ограничения, обусловленные историческими решениями и архитектурными особенностями. Пользователям рекомендуется переходить на современные терминальные приложения и использовать шрифты, которые обеспечивают лучшую поддержку многоязычных символов. Таким образом, исследуя альтернативы и адаптируя свои методы работы, можно существенно улучшить процесс отображения Юникода в консоли Windows.