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

XLC_LOCALE. Продолжение 1.




  Теперь можно перейти к самому XLC_LOCALE.

  Секцию для фонтов пока пропустим и начнем с XLC_XLOCALE

encoding_name		<имя чарсета>
  Фактически - название чарсета, вводимого с клавиатуры. Напомню, что
он важен только для GR кодов. Если вводимый символ < 128, то его можно
интерпретировать и как GL из того же чарсета и как просто ascii (GL от iso8859-1)
По этому параметру процедуры X[mb|wc|]LookupString определяют
  - как перекодировать keysym в байт
  - как потом сделать из него wc/mb/ct
(не могу удержаться - кривизна страшная. Сразу "подавляются" keysym, которые
не укладываются в этот encoding_name, хотя их можно было бы корректно перевести
в ctext, например. Но это не "баг", а кривизна идеологии.)

mb_cur_max              <число>
  максимальное количество байтов в mb представлении. Обратите внимание, что
это - max. Каждый конкретный символ может быть и короче.
  Для iso8859-кодировок  всегда - 1.

state_depend_encoding   <true/false>
  Имеет смысл для некоторых CJK. Зависит ли интерпретация очередного символа
от предыдущих (предыдущего). Или другими словами - от текущего сотстояния
процедуры конвертации.
  Для iso8859-кодировок  всегда - False.

wc_encoding_mask        \x30000000
wc_shift_bits           7
  Относится к преобразованию в wc (и из него). К ним надо еще рассматривать
и wc_encoding из описаний кодесетов (об этом ниже).

wc_encoding_mask - "маскирует" те биты, которые "различают" чарсет.
То есть, в данном случае, wc может представлять четыре разных чарсета,
отличающихся тем - что у них в "замаскированной" части (0,1,2,3)

А wc_encoding (в описаниях разных кодесетов) как-раз указывает - что
в эту часть надо вписать, в зависимости от кодесета.

wc_shift_bits - определяют - когда несколько байтов (из mb) "упаковываются"
в один wc - на сколько бит сдвигать один относительно другого. Соответственно,
это же число определяет и - сколько бит от каждого байта надо взять.
  Обратите внимание, для всех кодировок типа iso8859, обычно если байт больше
128, то при преобразовании в wc из него берутся только семь бит.
То есть, в младшей части wc всегда будет семибитный код, а восьмой бит
"переезжает" в "замаскировнную" часть wc (точнее - туда обычно вписывается 3).
  (тоже не очень хорошо. Насколько я смог найти документации, обычно для
простых кодировок при преобразовании в wc, байт просто копируют туда. Это
преобразование можно описать как
wc_encoding_mask        \x00000000
wc_shift_bits           8
или
wc_encoding_mask        \x00000080
wc_shift_bits           7
  но, почему-то, в локалях xfree86 утвердился другой стандарт, который имеет
смысл для "длинных" кодов CJK)

use_stdc_env            True/False
  Имеется ввиду, что при приобразовании wc->mb (mb->wc) можно и нужно
использовать процедурки libc - mblen, mbtowc, wctomb и т.п.
  Кстати, от этого параметра очень сильно зависит - что получится на выходе
XwcLookup* (во всяком случае для iso8859). Как я уже сказал, стандартная
mbtowc просто скопирует байт в w_char (естественно, все прааметры типа wc_*
игнорируются). А если этот параметр false (кстати - так "по умолчанию") -
то преобразование будет - как я уже описал выше.
 (очередная кривизна - в XLC_LOCALE для iso8859-5 этот параметр - true,
а в koi8-* его нет, то есть - false. Кто виноват? И как правильнее?)

force_convert_to_mb     True/False
  На этот можно вообще не обращать внимание. Он означает, что при
преобразовании "чего-то во что-то" (я сам еще не разобрался), лучше сначала
сконвертировать в mb, а потом - в то, что нужно. Для кодировок iso8859
он вообще смысла не имеет и реально используется только в том куске,
который обрабатывет JIS.

  Продолжение следует...

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