Специфичное для локали расширение 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
Самолет вынесен неправильно.
Вопросы:
- Как я могу исключить клиентские библиотеки Motif или X11 (
libXt
,libX11
) как главные подозреваемые? - В частности, (как) я могу отобразить текстовую метку, используя набор шрифтов (
XFontSet
), а не обычный шрифт (XFontStruct
), не полагаясь на Motif - в идеале с установленным набором виджетов Athena? - Говоря о равнине
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
локали:
Как видите, полный русский алфавит отображается корректно, независимо от 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 и новее).