[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: KSI Linux




  Во-первых, я хотел попросить хозяина не гнать нас отсюда.
Эта тема, хотя и косвенно, имеет отношение, если не к locale,
то к "локализации" в широком смысле.

> >   А все ли toolkit'ы используют Xlib? Или кто-то сам переводит Cyrillic
> > в подходящие коды?
> 
> Именно так, я об этом писал в этот лист. Qt 2.0 делает это сам, так как хочет

  Извините мою дремучесть. А что такое - Qt 2.0?
Насколько я понял, последняя "фри" Qt - 1.42 (ну, может быть - 1.44).

  И вот разглядывая 1.42, я обнаружил, что...

> работать аж с X11R4. Он определяет charset по _имени_ переменной LANG. Если
> кодировка в ней указана, то смотрит на LC_CTYPE. Если не указана и там, то
> смотрит в свои таблицы, содранные с locale.alias. То есть locale.alias зашит в
> коды Qt.

  Она пытается "вытащить" charset из LANG, если он имеет вид
lang.charset
  Если в LANG нет точки, то, действительно, по своим таблицам ищет подходящий
lang и подставляет свой encoding (для всяких ru, ru_RU, russian - это
iso8859-5).
(О LC_CTYPE я там упоминания не нашел.)

  НО! Все это делается для выбора "фонтов".
На перекодировку вводимых символов из Cyrillic это влиять не должно.

  Ввод она "пропускает" через Xlib.
(Так что мой вопрос пока остается открытым - Есть ли такие toolkit'ы,
которые не используют Xlib на вводе?)

  Что касается "ввода через Xlib"...
  Для перевода keysym в ascii есть две функции (две ли?)
XLookupString и
XmbLookupString (mb - это multi byte)

  Так вот. Первая более "традиционная". Вторая использует "input context".
  Причем, обе используют разные таблицы (таблицы, конечно, идентичные,
но физически - это два разных массива) и разные методы определения charset.

  Если приложение пользуется XLookupString (а таких все меньше), то
charset берется либо из "переменной среды" _XKB_CHARSET (я проверял,
действительно - работает), либо из locale - encoding_name.
  Чтобы работал второй способ (когда _XKB_CHARSET не определена),
должна отработать "иксовая" setlocale (именно "иксовая", она описана
в Xlocale.h).

  А вот если приложение использует XmbLookupString (а именно ее норовят
вставлять сейчас в приложения), то название charset'а ищется как-то
по-другому. Похоже, что из той же loacle:encoding_name, но я не уверен.
  Кроме того, для правильной работы XmbLookup* обычно вызывают не setlocale,
а XSetLocaleModifiers. Чем это отличается от setlocale - я сейчас и пытаюсь
понять.

  Кстати, если вернуться к Qt (1.42), то она при инициализации приложения
вызывает и setlocale, и XSetLocaleModifiers.
  А для обработки ввода использует XLookup*, если "иксы" старее, чем 5,
или если почему-либо "input context" не определен.
  Если этот context определен (что и должно быть в нормальной ситуации),
то используется XmbLookup*.


-- 
 Ivan U. Pascal         |   e-mail: pascal@tsu.ru
   Administrator of     |   Tomsk State University
     University Network |       Tomsk, Russia