Чтение онлайн

ЖАНРЫ

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

Языковые проблемы управляются локалью. Ранее в главе мы уже видели

setlocale
POSIX предоставляет продуманный механизм для определения правил, посредством которых работает локаль; некоторые подробности см. в справочной странице GNU/Linux locale(5), а полностью — в самом стандарте POSIX.

Правда в том, что подробности на самом деле не нужны. Вам, как разработчику программ, не нужно беспокоиться о них; как заставить все работать, зависит от разработчиков библиотек. Все, что нужно, это понять концепции и использовать в своем коде соответствующие функции, такие, как

strcoll
(см. раздел 13.2.3 «Сравнение строк:
strcoll
и
strxfrm
»).

Современные системы GLIBC предоставляют отличную поддержку локалей, включая поддерживающие локали процедуры сопоставления регулярных выражений. Например,

расширенное регулярное выражение POSIX
[[:alpha:]][[:alnum:]]+
соответствует букве, за которой следуют одна или более букв или цифр (алфавитный символ, за которым следуют один или более алфавитно-цифровых символов). Определение того, какие символы соответствуют этим классам, зависит от локали. Например, это регулярное выражение соответствовало бы двум символам '
', тогда как регулярное выражение
[a-zA-Z][a-A-Zz0-9]+
традиционного, ориентированного на ASCII Unix — скорее всего нет. Классы символов POSIX перечислены в табл. 13.5.

Таблица 13.5. Классы символов регулярных выражений POSIX

Класс Соответствует
[:alnum:]
Алфавитно-цифровые символы
[:alpha:]
Алфавитные символы
[:blank:]
Символы пробела и табуляции.
[:cntrl:]
Управляющие символы
[:digit:]
Цифровые символы
[:graph:]
Символы, являющиеся одновременно печатными и видимыми. (Символ конца строки печатный, но не видимый, тогда как
$
является и тем, и другим.)
[:lower:]
Строчные алфавитные символы
[:print:]
Печатные (не управляющие) символы
[:punct:]
Знаки пунктуации (не буквы, цифры, управляющие или пробельные символы)
[:space:]
Пробельные символы (такие, как сам пробел, символы табуляции, конца строки и т.д)
[:upper:]
Заглавные алфавитные символы
[:xdigit:]
Символы из набора
abcdefABCDEF0123456789

13.4.4. Заключение

Возможно, вам никогда не придется иметь дело с различными наборами символов и их представлениями. С другой стороны, мир быстро становится «глобальным сообществом», и авторы программ не могут позволить себе быть ограниченными. Следовательно, стоит знать о проблемах интернационализации и наборов символов, а также способах их влияния на поведение вашей системы. По крайней мере, уже один из поставщиков дистрибутивов GNU/Linux устанавливает для систем в Соединенных Штатах локаль по умолчанию

en_US.UTF-8
.

13.5. Рекомендуемая литература

1. С, A Reference Manual, 5th edition, by Samuel P. Harbison III and Guy L. Steele, Jr., Prentice-Hall, Upper Saddle River, New Jersey, USA, 2002. ISBN: 0-13-089592-X.

Мы уже упоминали эту книгу раньше. Она дает точное и исчерпывающее описание развития и использования возможностей стандартной библиотеки С для работы с многобайтными и широкими символами. Это особенно ценно для современных систем, поддерживающих C99, поскольку библиотека была значительно усовершенствована для стандарта С 1999 г.

2. GNU gettext tools, by Ulrich Drepper, Jim Meyering, François Pinard, and Bruno Haible. Это руководство по GNU

gettext
. На системе GNU/Linux вы можете посмотреть локальную копию через '
info gettext
'. Или загрузить и распечатать последнюю версию (по адресу
ftp://ftp.gnu.org/gnu/gettext/
).

13.6.

Резюме

• Интернационализация и локализация программ подпадают под общее название поддержки родного языка. Широко распространенными сокращениями являются i18n, l10n и NLS. Центральным является понятие локали, которая позволяет настраивать набор символов, отображение даты, времени, денежных и числовых величин в соответствии с принятыми для данного языка и в данной стране нормами.

• Использование локали устанавливается с помощью функции

setlocale
. Различные категории локали предоставляют доступ к различным видам информации локали. Не использующие локаль программы действуют, как если бы они находились в локали «С», которая выдает типичные для систем Unix до NLS результаты: 7-разрядный ASCII, английские названия месяцев и дней и т.д. Локаль «POSIX» эквивалентна локали «С».

• Сравнение строк с учетом локали осуществляется функцией

strcoll
или комбинацией
strxfrm
и
strcmp
. Возможности библиотеки предоставляют доступ к сведениям о локали (
localeconv
и
nl_langinfo
), а также к специфического для локали форматирования (
strfmon
,
strftime
и
printf
).

• Обратной стороной получения относящейся к локали информации является вывод сообщений на местном языке. Модель

catgets
System V, хотя и стандартизована POSIX, трудна для использования и поэтому не рекомендуется. [151] Вместо этого GNU
gettext
реализует и расширяет оригинальный замысел Solaris.

• При использовании

gettext
оригинальная строка сообщения на английском действует в качестве ключа в двоичном файле перевода, из которого получается перевод строки. Каждое приложение указывает уникальный текстовый домен таким образом, чтобы
gettext
могла найти нужный файл с переводом (известный как «список сообщений»). Текстовый домен устанавливается с помощью функции
textdomain
. При тестировании или иной надобности местоположение списка сообщений можно изменить с помощью функции
bindtextdomain
.

151

GNU/Linux ее поддерживает, но лишь для совместимости — Примеч. автора.

• 

gettext
и ее варианты предоставляют доступ к переводам в различных текстовых доменах или различных категориях локалей. Вдобавок, функция
ngettext
и ее варианты дают возможность делать правильные переводы множественных чисел, не перегружая разработчика. Указатель положения в спецификаторе формата
printf
дает возможность перевода форматирующих строк, аргументы которых должны выводиться в другом порядке, чем они располагаются в строке.

• На практике GNU программы используют для пометки переводимых строк в исходных файлах заголовочный файл

gettext.h
и макросы
_
и
N_
. Такая практика обеспечивает удобочитаемость исходного кода и возможность его поддержки, предоставляя в то же время преимущества интернационализации и локализации.

• GNU

gettext
предоставляет многочисленные инструменты для создания и управления базами данных переводов (переносимых объектных файлов) и их двоичными эквивалентами (объектными файлами сообщений).

• Наконец, стоит быть в курсе проблем наборов символов и их представлений. Поставщики программного обеспечения не могут больше позволить себе предполагать, что их пользователи хотят работать лишь на одном языке.

Упражнения

1. Поддерживает ли ваша система локали? Если да, какая локаль используется по умолчанию?

2. Просмотрите справочную страницу locale(1), если она у вас есть. Сколько имеется локалей, если вы посчитаете их с помощью '

locale -a | wc -l
'?

3. Поэкспериментируйте с

ch13-strings.с
,
ch13-lconv.c
,
ch13-strfmon.с
,
ch13-quoteflag.c
и
ch13-times.c
в различных локалях. Какая из найденных локалей самая «необычная» и почему?

Поделиться с друзьями: