Установка локали в Linux
Подготовка локали к работе
Поддержка локали в РНР
Предикаты, основанные на локали
Функции библиотеки GNU Recode
Нечаянная радость: convert_cyr_string
Поддержка NLS
Русскому пользователю, да и программисту тоже, все таки удобнее работать с русским языком. Однако в большинстве книг переводных и отечественных авторов
этому вопросу уделяется, прямо скажем, мало внимания. Надеюсь, что эта глава
поможет заполнить существующие пробелы и облегчит разработку прикладных
программ с русскоязычным интерфейсом.
Широкое распространение UNIX привело к тому, что уже больше десятка лет назад в этой операционной системе была реализована унифицированная система
поддержки национальных алфавитов, которая именуется локалью (locale). Эта система реализована в виде набора программ и библиотек (общее название проекта — 118п) и позволяет осуществлять:
- сортировку символов кодовой таблицы в соответствии с национальным алфавитом;
- представление чисел, денежных единиц, даты и времени в привычных для языка форматах;
- выдачу диагностических сообщений на родном для пользователя языке.
Все эти средства встраиваются в UNIX, и от РНР, так же как и от других программ,
требуется только воспользоваться ими. К счастью, сделать все это можно, о чем мы
и поговорим в данной главе. Для этого нам потребуется разобраться с одной-единственной директивой компилятора, парой функций и настройками нескольких переменных окружения.
Прежде всего отметим, что заставить Perl понимать локаль и модифицировать представление выходных данных в соответствии с ее установками можно только в том
случае, если соблюдены все перечисленные ниже условия.
- Ваша операционная система поддерживает работу с локалью. Это означает, что несчастные мученики Windows всех мастей могут безболезненно пропустить эту главу.
- Локаль установлена в системе. Если локаль не активизирована при регистрации пользователя, то использовать ее просто так вы не сможете.
- РНР уведомлен о поддержке локали в системе. Для этого вы должны принудительно включать в каждой программе переключение на локаль кириллицы, поскольку переменные окружения, указывающие на установленную в системе языковую поддержку, благополучно игнорируются web-сервером и ваша РНР-программа этой информации просто не получает.
совет
Если вы хотите, чтобы приложение РНР обрабатывало и представляло вашу информацию в соответствии с установками некоторой локали, например КОИ-8Р, код программы
должен содержать вызов функции setlocale ('LC_ALL','ru_RU.KOI8-R').
11.2.1. Установка локали
Процесс установки локали мы будем рассматривать на основе горячо любимой
автором операционной системы Linux. Более конкретно, мы будем вести речь о
дистрибутиве Slackware, который, по моему мнению, в наибольшей степени подходит для построения серверной платформы, в которой чаще всего используются
программы на РНР. Впрочем, скорее всего, вы не встретитесь ни с какими неожиданностями при работе с другими дистрибутивными комплектами.
Практически во всех последних версиях системы вы можете найти исходные коды
локалей, которые помещаются в каталог/usr/share/il8n. Все они представляют собой обычные текстовые файлы, доступные для модификации. Так что если вас что-то не устраивает в общепринятой локали, вы можете переделать ее по своему усмотрению.
Для настройки нам потребуется каталог /usr/share/il8n/charmaps. Перейдя в этот
каталог, вы должны сгенерировать локаль для русской зоны, использующую кодировку КОИ-8. Для этого следует ввести команду
localedef -f KOI8-R -i ru_RU ru_RU.KOI8-R
В результате в каталоге/usr/share/locale появится каталог ru_RU.koi8-R. Теперь, из-за
ошибки в программе localedef, которую никто не удосужится исправить уже
несколько лет, вам необходимо переименовать каталог со скомпилированной
локалью:
mv ru_RU.koi8-r ru_RU.KOI8-R
Теперь, чтобы решить проблему глобально, достаточно поместить в файл /etc/profile
строку:
export LANG=ru_RU.KOI8-R
либо поступить еще более радикально:
export LC_ALL=ru_RU.KOI8-R
После вступления этих переменных окружения в силу (например, при повторной
регистрации в системе) вы обнаружите, что ваш Midnight Commander, как и большинство других системных программ, «заговорил» по-русски.
11.2.2. Настройка окружения
Механизм поддержки локали предполагает достаточно гибкую настройку отдельных ее фрагментов и даже возможность «смешения» стилей, при котором, например, таблица сортировки символов соответствует русскому языку, а отображение
даты и времени осуществляется «по-американски». Эта настройка реализуется
посредством механизма переменных окружения, которых мы кратко коснулись
выше. И хотя, как я уже указывал, РНР игнорирует параметры окружения, для
работы текстовых редакторов и прикладных программ этими настройками пренебрегать не следует.
В этом разделе мы рассмотрим, как грамотно воспользоваться механизмами настройки локали.
11.2.2.1. PERL_BADLANG
Эта переменная окружения оказывает влияние только на Perl. Установка этой переменной приведет к подавлению генерации предупреждения Perl при неудаче загрузки
локали во время запуска программы. Причинами неудачи могут быть отсутствие
поддержки локали в операционной системе или ошибочный ввод имени локали
при настройке системы. Значение этой переменной должно отличаться от «О» или «».
примечание
Переменная PERL_BADLANG только убирает генерацию предупреждения. По-хорошему,
вы должны выяснить, в чем проблема, и постараться ее устранить.
11.2.2.2. LC_ALL
Переменная LC_ALL представляет собой глобальную установку всех параметров
локали. При ее установке осуществляется перекрытие всех отдельных частных параметров, установленных с помощью других переменных, рассматриваемых ниже.
11.2.2.3. LC_CTYPE
Переменная LC_CTYPE устанавливает определения символов, правила преобразования к строчным и заглавным символам и т. д. Ее значение может перекрываться
переменными LANG и LC_ALL.
11.2.2.4. LC_COLLATE
Переменная окружения LC_COLLATE определяет локаль, в соответствии с которой
будет производиться сортировка символов. Дело в том, что внутри определения
любой локали имеется порядок следования букв в национальном алфавите. Ее значение перекрывается переменной LC_ALL, а при отсутствии LC_ALL и LC_COLLATE
таблица сортировки определяется по локали, указанной переменной LANG.
11.2.2.5. LC_MONETARY
Определяет формат, используемый для вывода денежных единиц. Перекрывается
переменной LC_ALL. При отсутствии определений переменных LC_ALL и LC_MONETARY
формат представления денежных единиц определяется переменной LANG.
11.2.2.6. LC_NUMERIC
Определяет формат представления чисел. В частности, задается наличие и вид
разделителей групп разрядов и вид десятичной запятой. Перекрывается переменной LC_ALL. При отсутствии определений переменных LC_ALL и LC_NUMERIC формат представления денежных единиц определяется переменной LANG.
11.2.2.7. LC_TIME
Указывает порядок форматирования даты и времени. Оказывает влияние на представление дня недели, порядка сокращения номера года, а также полных, несокращенных форматов. Перекрывается переменной LC_ALL. При отсутствии определений
переменных LC_ALL и LC_TIME формат представления денежных единиц определяется переменной LANG.
11.2.2.8. LANG
Это базовая переменная окружения, устанавливающая все параметры локали.
Обычно используется в системном файле /etc/profile, что предоставляет каждому
пользователю возможность внести коррективы в его собственное видение «идеальной локали».
|