SymfonyWorld Online 2022 Winter Edition

Преобразовывающие фильтры

Как и фильтры string.*, фильтры convert.* совершают действия, соответствующие их именам. Для получения дополнительной информации о конкретном фильтре, обратитесь к странице руководства соответствующей функции.

convert.base64-encode и convert.base64-decode

Использование этих фильтров эквивалентно обработке всех данных потока функциями base64_encode() и base64_decode() соответственно. convert.base64-encode поддерживает аргументы, переданные в виде ассоциативного массива. Если указан аргумент line-length, результат base64 будет разделён на куски длинной line-length символов каждый. Если указан аргумент line-break-chars, каждый кусок будет разделён указанными символами. Эти параметры дают такой же эффект, как и использование base64_encode() в паре с chunk_split().

Пример #1 convert.base64-encode и convert.base64-decode

<?php
$fp 
fopen('php://output''w');
stream_filter_append($fp'convert.base64-encode');
fwrite($fp"This is a test.\n");
fclose($fp);
/* Выведет:  VGhpcyBpcyBhIHRlc3QuCg==  */

$param = array('line-length' => 8'line-break-chars' => "\r\n");
$fp fopen('php://output''w');
stream_filter_append($fp'convert.base64-encode'STREAM_FILTER_WRITE$param);
fwrite($fp"This is a test.\n");
fclose($fp);
/* Выведет:  VGhpcyBp
          :  cyBhIHRl
          :  c3QuCg==  */

$fp fopen('php://output''w');
stream_filter_append($fp'convert.base64-decode');
fwrite($fp"VGhpcyBpcyBhIHRlc3QuCg==");
fclose($fp);
/* Выведет:  This is a test.  */
?>

convert.quoted-printable-encode и convert.quoted-printable-decode

Использование decode-версии этого фильтра эквивалентно обработке всех данных потока функцией quoted_printable_decode(). У фильтра convert.quoted-printable-encode нет эквивалентной функции. convert.quoted-printable-encode поддерживает аргументы, переданные в виде ассоциативного массива. В дополнение к аргументам, поддерживаемыми convert.base64-encode, convert.quoted-printable-encode также поддерживает boolean-аргументы binary и force-encode-first. convert.base64-decode поддерживает лишь аргумент line-break-chars в качестве подсказки для чистки закодированных данных.

Пример #2 convert.quoted-printable-encode & convert.quoted-printable-decode

<?php
$fp 
fopen('php://output''w');
stream_filter_append($fp'convert.quoted-printable-encode');
fwrite($fp"This is a test.\n");
/* Выведет:  =This is a test.=0A  */
?>

convert.iconv.*

Фильтры convert.iconv.* доступны в том случае, если включена поддержка iconv и их использование аналогично обработке потоковых данных с помощью iconv(). Эти фильтры не поддерживают параметров. Вместо этого ожидается, что исходная и целевая кодировки были заданы в имени фильтра таким образом: convert.iconv.<input-encoding>.<output-encoding> или convert.iconv.<input-encoding>/<output-encoding> (оба варианта семантически эквивалентны).

Пример #3 convert.iconv.*

<?php
$fp 
fopen('php://output''w');
stream_filter_append($fp'convert.iconv.utf-16le.utf-8');
fwrite($fp"T\0h\0i\0s\0 \0i\0s\0 \0a\0 \0t\0e\0s\0t\0.\0\n\0");
fclose($fp);
/* Выведет: This is a test. */
?>
add a note

User Contributed Notes 1 note

up
1
marcus at synchromedia dot co dot uk
1 month ago
It's not quite obvious what all the available parameters are for convert.quoted-printable-encode. If you want the stream filter to act the same way as the quoted_printable_encode function, you need these extra params, for example:

stream_filter_append(
    STDOUT,
    'convert.quoted-printable-encode',
    STREAM_FILTER_WRITE,
    [
        'line-break-chars' => PHP_EOL,
        'line-length' => 75,
    ]
);
echo stream_copy_to_stream(STDIN, STDOUT);

Without these extra params set, you may get no wrapping at all, or wrapping using the wrong line break sequence.
To Top