PHP-4 Эффективная работа


Установка локали в Linux
Подготовка локали к работе
Поддержка локали в РНР
Предикаты, основанные на локали
Функции библиотеки GNU Recode
Нечаянная радость: convert_cyr_string
Поддержка NLS

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

11.1. Установка локали в Linux

Широкое распространение UNIX привело к тому, что уже больше десятка лет назад в этой операционной системе была реализована унифицированная система поддержки национальных алфавитов, которая именуется локалью (locale). Эта система реализована в виде набора программ и библиотек (общее название проекта — 118п) и позволяет осуществлять:

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

Все эти средства встраиваются в UNIX, и от РНР, так же как и от других программ, требуется только воспользоваться ими. К счастью, сделать все это можно, о чем мы и поговорим в данной главе. Для этого нам потребуется разобраться с одной-единственной директивой компилятора, парой функций и настройками нескольких переменных окружения.

11.2. Подготовка локали к работе

Прежде всего отметим, что заставить 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, что предоставляет каждому пользователю возможность внести коррективы в его собственное видение «идеальной локали».

назад
далее

Сайт управляется системой uCoz