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


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

11.4.Предикаты, основанные на локали

Вторая категория функций, использующих локаль, представляет собой предикаты, принимающие в качестве аргумента строковые значения. Важной особенностью РНР является тот факт, что под определение строки попадает тот набор букв (знаков), который соответствует действующей в данный момент времени локали. В этом отношении РНР отличается, например, от 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 или их строчные эквиваленты.

11.5. Функции библиотеки GNU Recode

Если при компиляции РНР вы указали ключ --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.6. Нечаянная радость: convert_cyr_string

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

назад
далее

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