Специфичное для локали расширение XFontSet

В моем приложении Motif (исходный код здесь, требуется Motif 2.1+ (-lXm -lXt -lX11) и C99-совместимый компилятор; на Cygwin должен быть дополнительно связан с -liconv Я пытаюсь получить XFontSet экземпляр, преобразованный из не зависящего от кодирования XLFD (например, -monotype-arial-medium-r-normal--*-90-*-*-p-0-*-*) быть правильно разложенным на несколько отдельных XFontStruct записи (...-iso8859-1, ...-iso8859-5, ...-iso10646-1 и т. д.) соответствует текущей локали.

Я обнаружил, что в некоторых местах (en_US.UTF-8, ru_RU.ISO-8859-5), XFontSet расширение работает отлично пока в других (ru_RU.UTF-8, ru_RU) это не так (неподходящие отдельные шрифты в наборе шрифтов), что приводит к символам, отличным от Latin-1 Самолет вынесен неправильно.

Вопросы:

  1. Как я могу исключить клиентские библиотеки Motif или X11 (libXt, libX11) как главные подозреваемые?
  2. В частности, (как) я могу отобразить текстовую метку, используя набор шрифтов (XFontSet), а не обычный шрифт (XFontStruct), не полагаясь на Motif - в идеале с установленным набором виджетов Athena?
  3. Говоря о равнине libX11 API, мое понимание правильное, я должен экспериментировать с семействами функций XmbDrawString() и XwcDrawString()?

Если у вас есть дополнительные комментарии рег. код, который не дает прямого ответа на вышеуказанные вопросы, но может помочь отследить проблему - это приветствуется.


Версия TL;DR

Я особенно заинтересован в том, чтобы кириллица правильно отображалась независимо от текущей локали при условии, что:

  • локаль поддерживается X11, и
  • Кириллица представлена ​​в кодировке локали.

Это оставляет меня со следующим списком локалей:

  • ru_RU;
  • ru_RU.ISO-8859-5 (который должен быть таким же, как ru_RU, но это не так, см. ниже);
  • ru_RU.KOI8-R;
  • ru_RU.CP1251;
  • ru_RU.UTF-8;
  • en_US.UTF-8 как и любой xx_YY.UTF-8,

ru_RU, без потери общности, может быть легко заменен на uk_UA, be_BY или же bg_BG,

В моем тестовом коде я создаю XmLabel экземпляры с метками, произведенными разными XmStringCreate*() / XmStringGenerate() заводские методы.

Мотив 2.3.4, как правило, показывал, что он поддерживает кириллицу, за некоторыми исключениями (или регрессиями по отношению к Мотиву 2.1). Я не уверен, что регрессия проистекает из самого мотива (libXm) или клиентские библиотеки X11 (libXt, libX11). Путь шрифта X11 был одинаковым во всех тестах, поэтому не нужно обвинять конкретный сервер X или сервер шрифтов X.

В основном я обнаружил 2 проблемы при использовании Motif 2.3.4:

ru_RU поддержка локали

Ссылка рендеринга получена в ru_RU.ISO-8859-5 локали:

Рендеринг ссылок получен в локали ru_RU.ISO-8859-5

Как видите, полный русский алфавит отображается корректно, независимо от XmString Фабрика используется.

В каждом из трех случаев приложение печатает содержимое XFontSet экземпляр на стандартный вывод:

locale: ru_RU.ISO-8859-5
run-time charset: ISO-8859-5
XmStringCreateLocalized():
    XmFONT_IS_FONTSET (ru_RU.ISO-8859-5): -monotype-arial-medium-r-normal--*-90-*-*-p-0-*-*, -monotype-arial-regular-r-normal--*-90-*-*-p-0-*-*
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
XmStringCreate():
    XmFONT_IS_FONTSET (ru_RU.ISO-8859-5): -monotype-arial-medium-r-normal--*-90-*-*-p-0-*-*, -monotype-arial-regular-r-normal--*-90-*-*-p-0-*-*
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
XmStringGenerate(XmCHARSET_TEXT):
    XmFONT_IS_FONTSET (ru_RU.ISO-8859-5): -monotype-arial-medium-r-normal--*-90-*-*-p-0-*-*, -monotype-arial-regular-r-normal--*-90-*-*-p-0-*-*
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
        -monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5

Теперь то же самое приложение запущено в ru_RU локали. Мотив 2.2:

По какой-то причине XFontSet содержит только KOI8-R шрифт вместо ISO-8859-5 шрифт:

-monotype-arial-medium-r-normal--12-90-100-100-p-0-koi8-r

Мотив 2.3:

В этом случае ничего не отображается, в то время как XFontSet содержит больше шрифтов, чем на самом деле необходимо:

-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-1
-monotype-arial-medium-r-normal--12-90-100-100-p-0-koi8-r
-monotype-arial-medium-r-normal--12-90-100-100-p-0-microsoft-cp1251
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso10646-1

Это регрессия по сравнению с Motif 2.1.0 (затронуты версии 2.1.30 и новее).

ru_RU.UTF-8 поддержка локали

Ссылка рендеринга получена в en_US.UTF-8 локали:

В дополнение к 3 XmString заводы проверены в 8-битном режиме, XmStringGenerate(XmMULTIBYTE_TEXT) дополнительно протестирован. XFontSet содержит следующие записи (на самом деле, все возможно XFontStruct записи для шрифта Monotype Arial):

-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-1
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-2
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-3
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-4
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
-monotype-arial-medium-r-normal--12-90-100-100-p-0-koi8-r
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-7
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-9
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-13
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-15
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso10646-1

Теперь то же самое в ru_RU.UTF-8 локали:

Выглядит неправильно XFontStruct используется, несмотря на XFontSet экземпляр содержит все необходимое XFontStruct записей:

-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-1
-monotype-arial-medium-r-normal--12-90-100-100-p-0-koi8-r
-monotype-arial-medium-r-normal--12-90-100-100-p-0-microsoft-cp1251
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso8859-5
-monotype-arial-medium-r-normal--12-90-100-100-p-0-iso10646-1

Обновление: получается в ru_RU.UTF-8 локаль, LANG виновата переменная окружения (с пустым LANG или же LANG=C или же LANG=en_US.UTF-8, Кириллица отображается правильно), пока LC_ALL можно безопасно установить на ru_RU.UTF-8,

Это регрессия по сравнению с Motif 2.2 (затронуты версии 2.3.0 и новее).

0 ответов

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