2015-12-18 1 views
1

Я пытаюсь отобразить некоторые Unicode (на самом деле кириллицу), используя XmLabel и шрифт XLFD на стороне сервера (-monotype-arial-medium-r-normal--*-90-*-*-p-*-iso10646-1). Всякий раз, когда я использую XmStringCreate() или XmStringCreateLtoR() как завод XmString, результат соответствует моим ожиданиям.XmStringGenerate() в режиме XmMULTIBYTE_TEXT или XmWIDECHAR_TEXT

Когда я пытаюсь использовать XmStringGenerate() завод, однако, проходя в любом XmMULTIBYTE_TEXT для многобайтовой строки в Unicode, или XmWIDECHAR_TEXT для широкой строки, мусор визуализируется на экране, независимо от используемого шрифта (я пробовал оба UTF-8 и однобайтовые кириллические серверные шрифты).

Результат можно увидеть ниже (1-й 2 строки в порядке, второй через 6-лейблов были созданы с XmStringGenerate() и, очевидно, не нормально):

enter image description here

Полный код (требуется Motif 2.1+ и C99-совместимый компилятор) - here.

Может ли кто-нибудь предложить рабочий пример XmStringGenerate(), подходящий для отображения Unicode символов (не только ISO-8859-1)?

+1

Ида-приграмма от fbida https://www.kraxel.org/releases/fbida/ использует XmStringGenerate и работает с текстом UTF-8 в моей системе. Я не очень разбираюсь в Motif, поэтому я не могу сказать вам, что именно отличается от этого и вашего кода. –

+0

@ n.m .: Посмотрел исходный код 'ida'. В принципе, то, что я нашел до сих пор, - это «XmCHARSET_TEXT», которое может использоваться для отображения многоуровневой строки независимым от языка образом: «XmStringGenerate (mbs,« UTF-8 », XmCHARSET_TEXT, NULL)». С другой стороны, 'ida' использует' XmStringGenerate (mbs, NULL, XmMULTIBYTE_TEXT, NULL) ', но это работает только для локалей Unicode (установка' LANG' на 'C' ломает программу, если она не отменяет локаль через' setlocale() 'при запуске). – Bass

+1

Да, многобайтовый текст - это только UTF-8, если ваш язык - UTF-8. Вы знаете, что есть другие локали, некоторые из которых имеют свои собственные многобайтовые кодировки, отличные от UTF-8. –

ответ

1

XmMULTIBYTE_TEXT является Локальнозависимым как n.m предложил, и, кроме CJK (я. Е. Для римских и славянских языков), может быть использован только в UTF-8 местах. Основные шрифты X11 могут быть заданы либо как шрифты (XmFONT_IS_FONT):

-monotype-arial-medium-r-normal--*-90-*-*-p-*-iso10646-1 

или наборы шрифтов (XmFONT_IS_FONTSET):

-monotype-arial-medium-r-normal--*-90-*-*-p-*-*-*: 

Говоря о режиме XmWIDECHAR_TEXT, представляется невозможным указать правильный шрифт с явным кодированием, но установка шрифта вместо этого отлично работает для Motif с 2.1 по 2.3.

Смежные вопросы