Какие ограничения есть у консоли Windows относительно Unicode?

Можно записывать символы Unicode в консоль Windows, используя WriteConsoleW функция. На моем компьютере с Windows 7 похоже, что консоль не поддерживает символы вне базовой многоязычной плоскости. Кроме того, объединяющие символы отображаются после базового символа, а не фактически объединяются.

Эти ограничения также присутствуют в более поздних версиях Windows? Существуют ли другие ограничения на Unicode в консоли Windows?

2 ответа

Я написал частичный ответ в своем ответе на другой вопрос; Здесь хорошее место для полного раскрытия. Мой фон: я поддерживаю, по всей вероятности, самый обширный консольный шрифт, который полностью поддерживает Windows (это очень глубокая перезапись Unifont с добавлением элементов DejaVu).

Я начну с ограничений, уже упомянутых в других ответах:

  • Каждая ячейка содержит 16 бит символьных данных. Другими словами: отображаются только кодовые точки UCS-2. (В частности, для персонажа вне BMP вместо этого показано его "разложение на UCS-2" с использованием суррогатных символов.)

  • поддерживается только простой рендеринг текста. Даже если кто-то использует шрифты TTF, расширенные "возможности" шрифта не рассматриваются консолью. Ни предварительная типография (лигатуры и т. Д.), Ни даже составление глифов для составления символов или сценариев с написанием справа налево left (в среде LtR) не будут работать должным образом.

    Application Это приложение, которое должно переставлять символы для правильного биди-рендеринга.

Фильтрация шрифтов

Другие ограничения связаны с фильтрацией шрифтов с помощью консоли. Шрифт должен быть совершенно особенным, чтобы быть принятым консолью (должен отображаться в диалоге выбора шрифта, и этот выбор "работать" ¹⁾).

Recall Я не помню, может ли быть показан шрифт, но его нельзя будет выбрать (у меня смутная память об этом, но я не могу доверять этой памяти).

  • Шрифт должен быть помечен как моноширинный. Из-за ожиданий приложений, "такие шрифты должны иметь все символы одинаковой ширины.

    "Последнее условие уместно, только если кто-то хочет использовать шрифт вне консоли. В принципе, консоль не проверяет ширину глифов. Однако каждый глиф отображается так, как если бы он имел "ширину по умолчанию". Во многих (всех?) Ситуациях будет показана только часть глифа внутри "ограничивающей рамки по умолчанию". Я не мог найти хитрости, чтобы обойти это ограничение.

  • В не восточноазиатских выпусках Windows шрифт не может утверждать, что он поддерживает любую из 4 восточноазиатских кодовых страниц.

    Обратите внимание, что это только ограничение того, что заявляет заголовок шрифта - это всего лишь 4 бита, присутствующих в заголовке. В шрифте могут присутствовать глифы для этих языков, и они будут хорошо отображаться, поскольку шрифт не требует поддержки. Рассматриваемые кодовые страницы (в разделе заголовков OS/2Charsets): 932, 936, 949, 950 (JIS, упрощенный китайский, корейский Wansung, традиционный китайский).

Ошибки в рендеринге шрифтов

  • Хотя консоль Windows не поддерживает Underline атрибут (кроме кодовых страниц DBCS), " Underline position ”Поле заголовка шрифта учитывается при расчете размера экранного символа bbox. Это может привести к неожиданному соотношению сторон шрифта и / или к прерываниям между глифами, которые, как ожидается, "объединятся".

  • Консоль очень требовательна к символу замены для "неподдерживаемых символов". Я не мог найти, как заставить такой глиф сосуществовать с наличием глифов для U+0000 и / или U+0001, (Если консоль находит один из последних двух глифов в шрифте, она игнорирует замещающий глиф.)

  • (Это очень непонятная ошибка; она требует очень технического обсуждения.) Другая проблема с заменяющим глифом - это символ U+30FB · (ЗАЧЕМ?!). Если этот символ присутствует в шрифте, глиф для этого символа используется в качестве символа замены - но только для отсутствующих символов в PUA!

По сути, это все! Я не нашел никаких других ограничений.

Консоль Windows ограничена базовой многоязычной плоскостью

Ваша ссылка на функцию WriteConsole ничего не говорит о полезных символах консоли:

  • lpBuffer [in] Указатель на буфер, который содержит символы для записи в экранный буфер консоли.

Но что это за буфер? Простой поиск в Google для структуры writeconsole lpbuffer дает (косвенную) ссылку на структуру CHAR_INFO:

Синтаксис (C++)

typedef struct _CHAR_INFO {
  union {
    WCHAR UnicodeChar;
    CHAR  AsciiChar;
  } Char;
  WORD  Attributes;
} CHAR_INFO, *PCHAR_INFO;

Но что это WCHAR UnicodeChar? Опять же, простой поиск в Google для Windows wchar дает ссылку на типы данных Windows:

И, наконец, приведенная выше ссылка " Наборы символов, используемые шрифтами" дает следующее окончательное следствие: консоль Windows ограничена базовой многоязычной плоскостью, то есть 16-разрядным подмножеством Unicode:

Набор символов Юникода

… Для решения проблемы множественных схем кодирования был разработан стандарт Unicode для представления данных. 16-битная схема кодирования символов, Unicode может представлять 65 536 (2^16) символов, что достаточно для включения всех языков в современной компьютерной торговле, а также знаков препинания, математических символов и места для расширения. Unicode устанавливает уникальный код для каждого символа, чтобы гарантировать, что перевод символов всегда точен.

Другие вопросы по тегам