Rawurldecode: примеры (PHP)

Декодирование URL строк в PHP с помощью rawurldecode
Раздел: URL
rawurldecode(string $string): string

Функция rawurldecode в PHP

Функция rawurldecode() выполняет декодирование строки, закодированной в соответствии со стандартом RFC 3986. Она преобразует последовательности процентов, за которыми следуют два шестнадцатеричных цифры, обратно в соответствующие символы.

Когда используется

Функция применяется для обработки данных, полученных из URL, особенно когда важно сохранить плюсы (+) как литералы, а не преобразовывать их в пробелы. Это отличает rawurldecode() от функции urldecode().

Аргументы функции

Функция принимает один обязательный параметр:

  • string - строка, подлежащая декодированию. Ожидается, что строка содержит процентные кодирования (например, %20 для пробела).

Возвращает декодированную строку или false в случае ошибки (хотя ошибки возникают редко).

Примеры использования rawurldecode

Базовый пример

Декодирование простой строки с пробелом:

echo rawurldecode('Hello%20World');
Hello World
Декодирование специальных символов

Обработка строки с различными закодированными символами:

echo rawurldecode('%24%26%2B%2C%3A%3B%3D%3F%40');
$&+,:;=?@
Сохранение символа плюс

Сравнение поведения с обычной функцией urldecode():

echo 'rawurldecode: ' . rawurldecode('test+string') . "\n";
echo 'urldecode: ' . urldecode('test+string');
rawurldecode: test+string
urldecode: test string

Похожие функции в PHP

Декодирует URL-кодированную строку, преобразуя плюсы (+) в пробелы. Используется для данных, закодированных с помощью application/x-www-form-urlencoded.

htmlspecialchars_decode()

Преобразует специальные HTML-сущности обратно в символы. Применяется для вывода HTML-безопасного текста.

Когда что использовать

Функцию rawurldecode() применяют при работе с путями URL, где плюс должен оставаться плюсом. Функцию urldecode() используют для декодирования данных форм, где плюс традиционно означает пробел.

Альтернативы в других языках

Rawurldecode в Python

Функция urllib.parse.unquote() с параметром encoding='utf-8':

from urllib.parse import unquote
print(unquote('Hello%20World%2B', encoding='utf-8'))
Hello World+

Rawurldecode в Javascript

Метод decodeURIComponent() для декодирования компонентов URL:

console.log(decodeURIComponent('Hello%20World%2B'));
Hello World+

Rawurldecode в MySQL

Функция UNHEX() в сочетании с REPLACE для простых случаев:

SELECT REPLACE('Hello%20World', '%20', ' ');
Hello World

Типичные ошибки

Двойное декодирование

Повторное применение функции к уже декодированной строке:

$str = 'test%20string';
echo rawurldecode(rawurldecode($str));
test string

Ошибки не возникает, но второй вызов бесполезен.

Некорректные процентные последовательности

Передача неправильно закодированных данных:

echo rawurldecode('test%2');
test%2

Символы, не образующие полную процентную последовательность, остаются без изменений.

Проблемы с кодировкой

Использование с не-UTF8 строками без учета кодировки:

$str = rawurlencode(iconv('UTF-8', 'Windows-1251', 'тест'));
echo rawurldecode($str);
������

Изменения в версиях PHP

PHP 8.0

Введена строгая типизация. Передача нестроковых значений теперь вызывает TypeError вместо их преобразования в строку.

echo rawurldecode(null);
TypeError: rawurldecode(): Argument #1 ($string) must be of type string, null given
PHP 7.4

Устаревшие предупреждения при передаче неправильных типов, но с автоматическим преобразованием.

Расширенные примеры

Декодирование параметров URL

Обработка query-строки с сохранением плюсов:

Пример php
$query = 'city=Moscow%2BRegion&code=123%20456';
parse_str($query, $params);
foreach ($params as $key => $value) {
    echo rawurldecode($key) . ': ' . rawurldecode($value) . "\n";
}
city: Moscow+Region
code: 123 456
Обработка пути файла

Декодирование URL-путей с кириллицей:

Пример php
$path = '/uploads/%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82.pdf';
echo rawurldecode($path);
/uploads/документ.pdf
Рекурсивное декодирование

Безопасное декодирование до получения стабильного результата:

Пример php
function safeRawUrldecode($string) {
    $decoded = rawurldecode($string);
    while ($decoded !== $string) {
        $string = $decoded;
        $decoded = rawurldecode($string);
    }
    return $decoded;
}
echo safeRawUrldecode('test%2520space');
test space
Работа с фрагментами URL

Декодирование anchor-ссылок:

Пример php
$fragment = '%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%201';
echo '#' . rawurldecode($fragment);
#Раздел 1

PHP rawurldecode function comments

En
Rawurldecode Decode URL-encoded strings