Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2557 / 712 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 13:

Языково-культурная среда

Категория LC_COLLATE определяет порядок алфавитного сравнения символов для многочисленных служебных программ ( sort, uniq и т.д.), регулярных выражений, а также функций strcoll(), strxfrm() и других.

В алфавитном сравнении могут участвовать односимвольные и многосимвольные элементы. Их порядок задается весами, которых у каждого элемента может быть несколько (не более COLL_WEIGHTS_MAX ). Первый вес называется основным. Если при сравнении элементов основные веса совпали, используются соответственные пары дополнительных – до тех пор, пока либо не будет обнаружено неравенство, либо не кончатся веса.

Допускается формирование классов эквивалентности – присвоение одного основного веса нескольким элементам сравнения. Поддерживаются также отображения один-ко-многим (один символ отображается в последовательность элементов сравнения).

Разумеется, сравнение цепочек символов начинается с разбиения на элементы сравнения.

Правила алфавитного сравнения и директивы присвоения весов открываются ключевым словом order_start и завершаются директивой order_end. Подразумеваемым правилом является forward – сравнение от начала к концу цепочки. Возможен и противоположный порядок ( backward ).

После строки order_start элементы сравнения перечисляются в порядке возрастания. После элемента может быть задана последовательность его весов. Веса задаются как относительные, в виде имен других элементов и определяются позицией этих элементов при перечислении. Специальный вес IGNORE означает, что данный элемент следует игнорировать при сравнении цепочек. Многоточие в качестве элемента сравнения обозначает диапазон от предыдущего до последующего элементов. Элемент UNDEFINED представляет все, что не было указано явно.

В POSIX-среде алфавитный порядок совпадает с упорядоченностью символов в кодировке ASCII.

Категория LC_MONETARY определяет формат денежных величин. Входящие в нее элементы именуются аналогично полям приведенной выше структуры lconv. Например, после ключевого слова currency_symbol задается цепочка символов, обозначающая местные денежные величины. Если ключевое слово данной категории отсутствует в файле определения среды либо его значением является пустая цепочка или -1, значит, соответствующий элемент в языково-культурной среде неспецифицирован.

В POSIX-среде все элементы этой категории остаются неспецифицированными.

В категории LC_NUMERIC, во многом аналогичной LC_MONETARY, определяются правила и обозначения, используемые применительно к числовым данным. Здесь также действует параллель со структурой lconv.

В листинге 13.3 показано определение категории LC_NUMERIC для POSIX-среды. Собственно, специфицируется только десятичная точка.

LC_NUMERIC
# POSIX-среда, категория LC_NUMERIC
#
decimal_point "<period>"
thousands_sep ""
grouping -1
#
END LC_NUMERIC
13.3. Определение категории LC_NUMERIC для POSIX-среды.

Элементы категории LC_TIME определяют интерпретацию спецификаторов преобразований и, тем самым, поведение служебной программы date, а также функций strftime(), strptime() и некоторых других. В число поддерживаемых ключевых слов входят abday (сокращенные названия дней недели, начиная с воскресенья; элемент соответствует спецификатору %a ), day (полные названия дней недели, %A ), abmon (сокращенные названия месяцев, %b ), mon (полные названия месяцев, %B ), d_t_fmt (принятое в данной языково-культурной среде представление даты и времени, %c ), d_fmt (принятое в данной среде представление даты, %x ), t_fmt (принятое в данной среде представление времени, %X ).

Особым образом устроен элемент era, определяющий способ отсчета и отображения лет для каждой эры, поддерживаемой языково-культурной средой. Операнд ключевого слова era состоит из цепочек символов, каждая из которых описывает конкретную эру и имеет следующий формат:

направление:смещение:начальная_дата:
конечная_дата:имя_эры:формат_эры

Здесь направление – знак плюс или минус, смещение – ближайший к начальной дате номер года, начальная_дата – цепочка вида гггг/мм/дд (год, месяц и число начала эры), конечная_дата – год, месяц и число конца эры либо цепочки "-*" (конечной датой служит начало отсчета времени) или "+*" (конечной датой служит конец отсчета времени), формат_эры – цепочка, используемая при форматировании номеров года в эре.

Отметим, что точка отсчета может быть как самой ранней, так и самой поздней в эре. Примерами служат две христианские эры – после и до Рождества Христова, соответственно.

В листинге 13.4 показано определение категории LC_TIME для POSIX-среды.

LC_TIME
# POSIX-среда, категория LC_TIME
#
# Сокращенные названия дней недели (%a)
abday "<S><u><n>";"<M><o><n>";"<T><u><e>";\
"<W><e><d>";"<T><h><u>";"<F><r><i>";"<S><a><t>"
#
# Полные названия дней недели (%A)
day "<S><u><n><d><a><y>";\
"<M><o><n><d><a><y>";\
"<T><u><e><s><d><a><y>";\
"<W><e><d><n><e><s><d><a><y>";\
"<T><h><u><r><s><d><a><y>";\
"<F><r><i><d><a>\<y>";\
"<S><a><t><u><r><d><a><y>"
#
# Сокращенные названия месяцев (%b)
abmon "<J><a><n>";"<F><e><b>";"<M><a><r>";\
"<A><p><r>";"<M><a><y>";"<J><u><n>";\
"<J><u><l>";"<A><u><g>";"<S><e><p>";\
"<O><c><t>";"<N><o><v>";"<D><e><c>"
#
# Полные названия месяцев (%B)
mon "<J><a><n><u><a><r><y>"\
"<F><e><b><r><u><a><r><y>";\
"<M><a><r><c><h>";"<A><p><r><i><l>";\
"<M><a><y>";"<J><u><n><e>";\
"<J><u><l><y>";"<A><u><g><u><s><t>";\
"<S><e><p><t><e><m><b><e><r>";\
"<O><c><t><o><b><e><r>";\
"<N><o><v><e><m><b><e><r>";\
"<D><e><c><e><m><b><e><r>"
#
# Эквивалент AM/PM (%p) "AM";"PM"
am_pm "<A><M>";"<P><M>"
#
# Принятое в POSIX-среде представление даты и
времени (%c)
# "%a %b %e %H:%M:%S %Y"
d_t_fmt "<percent-sign><a><space><percent-sign>\
<b><space><percent-sign><e><space>\
<percent-sign><H><colon><percent-sign>\
<M><colon><percent-sign><S><space>\
<percent-sign><Y>"
#
# Принятое в POSIX-среде представление даты (%x)
"%m/%d/%y"
d_fmt "<percent-sign><m><slash><percent-sign><d>\
<slash><percent-sign><y>"
#
# Принятое в POSIX-среде представление времени (%X)
"%H:%M:%S"
t_fmt "<percent-sign><H><colon><percent-sign><M>\
<colon><percent-sign><S>"
#
# Принятое в POSIX-среде 12-часовое представление
времени (%r) "%I:%M:%S %p"
t_fmt_ampm "<percent-sign><I><colon><percent-sign\
<M><colon><percent-sign><S><space>\
<percent_sign><p>"
#
END LC_TIME
13.4. Определение категории LC_TIME для POSIX-среды.

Категория LC_MESSAGES играет весьма ограниченную роль, определяя положительные и отрицательные ответы. Соответственно, она содержит два элемента – yesexpr и noexpr, значениями которых служат расширенные регулярные выражения. Для POSIX-среды данная категория описывается так, как показано в листинге 13.5.

LC_MESSAGES
# POSIX-среда, категория LC_MESSAGES
#
yesexpr "<circumflex><left-square-bracket>\
<y><Y><right-square-bracket>"
#
noexpr "<circumflex><left-square-bracket>\
<n><N><right-square-bracket>"
#
END LC_MESSAGES
13.5. Определение категории LC_MESSAGES для POSIX-среды.
Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?