Установка локали в Linux
Подготовка локали к работе
Поддержка локали в РНР
Предикаты, основанные на локали
Функции библиотеки GNU Recode
Нечаянная радость: convert_cyr_string
Поддержка NLS
Вторая категория функций, использующих локаль, представляет собой предикаты, принимающие в качестве аргумента строковые значения. Важной особенностью
РНР является тот факт, что под определение строки попадает тот набор букв (знаков), который соответствует действующей в данный момент времени локали. В этом
отношении РНР отличается, например, от Common Lisp, в котором знаки кириллицы буквами в общепринятом смысле не являются.
примечение
В документации к РНР 4.0.5, которой я располагал во время подготовки этой книги, особо
указывалось, что имена этих функций еще «не устоялись» и вполне могут измениться в будущих версиях. При этом предполагается, что имена будут изменены либо на ctype_is*() вместо ctype_*(), либо будут попросту использованы те же имена функций, что и в библиотеке Си.
Все рассматриваемые в этом разделе функции основаны на стандартной библиотеке Си, поэтому при вызове с целочисленными аргументами они работают
совершенно так же, как и их аналоги из Си. При вызове со строковыми аргументами осуществляется проверка каждой буквы в строке и результат true возвращается только в том случае, если заданному критерию удовлетворяет каждая буква
строки.
При попытке передать функции значение, отличное от строки или цифры, работа
завершается немедленно и функция возвращает false.
Следует иметь в виду, что хотя аргументом всех этих функций является строка
(string), на практике, как и в Си, эти предикаты применяются, как правило, к отдельным символам.
11.4.1. Принадлежность к буквам и цифрам:ctype_alnum
bool ctype_alnum (string с)
Функция возвращает true, если в состав строки-аргумента входят только алфавитные и/или цифровые знаки в соответствии с определениями текущей локали.
11.4.2. Принадлежность к буквам: ctype_alpha
bool ctype_alpha (string с)
Функция возвращает true, если в состав строки-аргумента входят только буквы
в соответствии с определениями текущей локали.
11.4.3. Управляющие коды: ctype_cntrl
bool ctype_cntrl (string с)
Функция возвращает true, если в состав строки-аргумента входят только управляющие символы, такие например, как CTRL+S или CTRL+Q. Обычно это символы,
десятичный код которых меньше 32 (код пробела).
11.4.4. Проверка на принадлежность к цифрам:ctype digit
bool ctype_digit (string с)
Функция возвращает true, если в состав строки-аргумента входят только цифровые знаки в соответствии с определениями текущей локали.
11.4.5. Строчные буквы: ctypejower
bool ctype__lower (string с)
Функция возвращает true, если в состав строки-аргумента входят только цифры
и/или строчные буквы в соответствии с определениями текущей локали.
11.4.6. Любые печатные символы: ctype_graph
bool ctype_graph (string с)
Функция возвращает true, если в состав строки-аргумента входят только печатные символы (то есть те, которые не являются управляющими и имеют специальное изображение: образ буквы, знака препинания или цифры) в соответствии с определениями текущей локали. Пробел в число печатных символов не
входит.
11.4.7. Печатные символы, включая пробел:ctype_print
bool ctype_print (string с)
Функция возвращает true, если в состав строки-аргумента входят только печатные символы (то есть те, которые не являются управляющими и имеют специальное изображение: образ буквы, знака препинания или цифры) в соответствии с
определениями текущей локали, а также, в отличие от предыдущей функции,
и пробел.
11.4.8. Символы пунктуации: ctype_punct
bool ctype_punct (string с)
Функция возвращает true, если в состав строки-аргумента входят только символы пунктуации в соответствии с определениями текущей локали. К ним относятся
символы, не являющиеся буквами, цифрами или пробельными символами.
11.4.9. Пробельные символы: ctype_space
bool ctype_space (string с)
Функция возвращает true, если в состав строки-аргумента входят только символы, интерпретируемые как пробельные. К ним относятся пробел и символ табуляции (\t).
11.4.10. Прописные буквы: ctype_upper
bool ctype_upper (string с)
Функция возвращает true, если в состав строки-аргумента входят только прописные буквы в соответствии с определениями текущей локали.
11.4.11. Шестнадцатеричные цифры: ctype_xdigit
bool ctype_xdigit (string с)
Функция возвращает true, если строка-аргумент может быть интерпретирована
как число в шестнадцатеричной системе счисления. Это означает, что в состав строки могут входить только цифры и буквы А, В, С, D, E, F или их строчные эквиваленты.
Если при компиляции РНР вы указали ключ --with-recede, вы получаете возможность использовать доступ к функциям библиотеки GNU Recode 3.5 и выше.
Понятно, что предварительно вы должны установить эту библиотеку в системе.
11.5.1. Перекодировка строки: recode_string
string recode_string (string request, string string)
Функция осуществляет перекодировку строки string в соответствии с запросом
request. Возвращает перекодированную строку или false, если выполнить запрос не в состоянии.
Типовой запрос имеет вид «lat1.. iso646-de», где первой указывается исходная
интерпретация кодировки, а второй — целевая.
Вот небольшой пример использования этой функции:
print recode_string ("us..flat",
"The following character has a diacritical mark: &аacute;");
11.5.2. Перекодирование строки: recode
string recode (string request, string string)
Это просто синоним предыдущей функции recode_stri ng().
11.5.3. Перекодировка файла: recode_file
bool recode_file (string request, resource input,
resource output)
Функция выполняет перекодировку файла, доступного с помощью указателя input,
в соответствии с запросом request и помещает результат в открытый файл, адресуемый указателем output. В случае успешного выполнения операции функция
возвращает true, а в случае какой-либо ошибки — false.
В настоящее время функция не в состоянии перекодировать удаленные файлы
(указатели, которые используют вместо имени URL-адрес). Оба файла должны
быть размещены в локальной файловой системе.
$input = fopen ('input.txt', 'r');
$output = fopen ('output.txt', 'w');
recode_file ("us..flat", $input, $output);
По мере написания этой книги я изучал и книги «конкурентов», в результате чего
сделал немало интересных открытий. Одно из них, обнаруженное мною в книге
[11], — описание функции соnvert_c yr_string, которая входит в состав ядра РНР-
машины и предназначена именно для перекодировки кириллицы.
И хотя в тексте книги приводились высокоученые размышления американских
авторов об использовании этой функции для перекодировки с таджикского на
русский, а затем на монгольский, мы подобными штучками увлекаться не будем.
Эта функция использует следующий синтаксис:
string convert_cyr_string (string str, string from, string to)
Функция осуществляет преобразование строки string из кодировки fr от в кодировку to. При этом обозначения кодировок должны принимать следующие значения (однобуквенные строки):
k - КОИ8-Р;
w — windows-1251;
i - so8859-5;
а - х-ср866;
d — х-ср866 (синоним предыдущей);
m — x-mac-cyrillic.
Конечно, в эпоху торжества русского Apache, который автоматически приводит к
нужному виду и входную, и выходную кодировки документов, вопрос о ценности
этой функции может показаться спорным. Но, увы, желание части администраторов идти на поводу у «агрессивного большинства» часто приводит к недоразумениям и ошибкам в конфигурировании систем.
Вот небольшой пример из моей личной практики. Однажды мне заказали разработку комплекта сценариев для построения интерактивной системы заказов одной из компаний, открывшей свое web-присутствие в виде виртуального хоста известного московского провайдера.
примечание
Имена опускаются исключительно потому, что непосредственного отношения к технической сути проблемы они не имеют.
Так вот, поскольку на этом хосте было расположено немалое количество домашних
страничек, провайдер решил, что дисковая кодировка всех сценариев и HTML-страничек будет... windows-1251. Ну что же, решил, так решил... Нам пришлось
перекодировать все сценарии в эту кодировку, и HTML-код стал генерироваться
правильно. Для понимания возникших далее проблем надо отметить, что сам сервер
провайдера работал не под Windows, а под FreeBSD, для которой «родная» кодировка — это все же КОИ8-Р. Так вот, программа sendmail, отвечающая, как известно, за рассылку почты, вполне логично полагала, что все письма ходят именно
в этой кодировке! В результате текст письма, сгенерированного нашей программой
в «замечательной» Windows-1251, автоматически превращался в «кракозябры».
Что делать? Выяснять отношения с провайдером хостинга? Но как будет реагировать заказчик, если мы начнем кивать на затягивание сроков по вине провайдера?
Всегда виноват, в конце концов, исполнитель... Поэтому пришлось внутри сценария с генерацией текстовых сообщений в кодировке Windows вставлять фрагменты
в кодировке КОИ-8! Нет нужды говорить о том, что отладка такой каши оказалась
совсем не простым занятием. А если бы у нас под рукой тогда была эта функция...
Тогда проблема решалась бы легко и быстро:
$adresat = "klinton@whitehouse.gov";
// Формируем текст письма и его тему в основной кодировке
// программы
$subject = "Сим уведомляю...";
$body = "Дражайший сэр! ...";
// Теперь переводим строки в кодировку, воспринимаемую
// почтальоном
$subject = convert_cyr_string($subject,"w", "к") ;
$body = convert_cyr_string($body,"w","k");
// и отправляем письмецо через sendmail
mail($adresat,$subject,$message,
"From: cool@hacker.ru\r\nReply-to: ne-cool.@hacker. ru\r\n") ;
|