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

Функция urlencode для кодирования URL в PHP
Раздел: URL
urlencode(string string): string

Функция urlencode в PHP

Функция urlencode выполняет кодирование строки для безопасного использования в URL. Она преобразует специальные символы и символы с пробелами в формат, понятный для передачи через интернет. Использование этой функции актуально при формировании параметров запроса в URL адресах, например, при создании ссылок с GET параметрами.

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

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

  • string - строка, которая требует кодирования для включения в состав URL.

Функция возвращает строку, в которой все небуквенно-цифровые символы, кроме дефиса, подчеркивания и точки, заменены знаком процента и двумя шестнадцатеричными цифрами. Пробелы кодируются как знак плюс (+).

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

<?
echo urlencode('Привет мир!');
?>
%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82+%D0%BC%D0%B8%D1%80%21
<?
echo urlencode('price=$100&discount=15%');
?>
price%3D%24100%26discount%3D15%25
<?
echo 'https://example.com/search?q=' . urlencode('кофе и чай');
?>
https://example.com/search?q=%D0%BA%D0%BE%D1%84%D0%B5+%D0%B8+%D1%87%D0%B0%D0%B9

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

rawurlencode - выполняет кодирование согласно стандарту RFC 3986. В отличие от urlencode, пробел кодируется как %20 вместо знака плюс. Предпочтительнее для кодирования частей пути URL.

http_build_query - генерирует строку запроса URL из массива параметров. Автоматически применяет кодирование к ключам и значениям. Удобно для построения сложных запросов.

htmlspecialchars - экранирует специальные символы HTML. Используется для защиты от XSS атак при выводе данных в HTML, а не для кодирования URL.

Аналоги функции в других языках

Urlencode в Python

import urllib.parse
print(urllib.parse.quote('Привет мир!', encoding='utf-8'))
%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80%21

Функция quote кодирует пробел как %20. Для аналога urlencode с плюсом используют quote_plus.

Urlencode в Javascript

console.log(encodeURIComponent('Привет мир!'));
%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%20%D0%BC%D0%B8%D1%80!

encodeURIComponent также кодирует пробел как %20. Кодирует больше символов, чем PHP функция.

Urlencode в MySQL

SELECT ENCODE('Привет мир!', 'base64'); -- не прямой аналог

В MySQL нет прямой аналогичной функции. Рекомендуется выполнять кодирование на стороне приложения.

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

Двойное кодирование
<?
$str = 'data 123';
$encoded = urlencode(urlencode($str));
echo $encoded;
?>
data%2B123

При двойном кодировании знак плюс из первого кодирования трактуется как обычный символ и кодируется повторно.

Кодирование всего URL
<?
echo urlencode('https://example.com/page?param=value');
?>
https%3A%2F%2Fexample.com%2Fpage%3Fparam%3Dvalue

Функция не предназначена для кодирования целых URL, только для их частей. Это делает ссылку нерабочей.

Неверная обработка массивов
<?
$params = ['name' => 'John Doe', 'city' => 'New York'];
$url = 'https://example.com?' . urlencode($params);
echo $url;
?>
https://example.com?Array

При передаче массива функция преобразует его в строку 'Array'. Для кодирования параметров нужно использовать http_build_query.

Изменения в последних версиях PHP

В PHP 8.1.0 было изменено поведение при передаче значения null аргументу функции. Теперь это вызывает ошибку типа TypeError. Ранее значение null преобразовывалось в пустую строку.

<?
// PHP 8.0 и ранее
echo urlencode(null); // ''
// PHP 8.1 и новее
// echo urlencode(null); // TypeError
?>

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

Кодирование многомерных массивов
Пример php
<?
$data = [
    'user' => [
        'name' => 'Иван Петров',
        'preferences' => ['lang' => 'ru', 'theme' => 'dark']
    ],
    'action' => 'save'
];

$query = http_build_query($data);
echo 'https://api.example.com?' . $query;
?>
https://api.example.com?user%5Bname%5D=%D0%98%D0%B2%D0%B0%D0%BD+%D0%9F%D0%B5%D1%82%D1%80%D0%BE%D0%B2&user%5Bpreferences%5D%5Blang%5D=ru&user%5Bpreferences%5D%5Btheme%5D=dark&action=save
Работа с кириллическими доменами
Пример php
<?
$domain = 'пример.рф';
$encoded = urlencode($domain);
echo 'https://' . $encoded . '/page';
?>
https://%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80.%D1%80%D1%84/page

Для интернационализованных доменных имен следует использовать функцию idn_to_ascii.

Кодирование данных для curl запроса
Пример php
<?
$postData = [
    'title' => 'Статья о PHP',
    'content' => 'Содержание с & и = символами',
    'tags' => 'php,web,development'
];

$encodedData = '';
foreach ($postData as $key => $value) {
    $encodedData .= $key . '=' . urlencode($value) . '&';
}
$encodedData = rtrim($encodedData, '&');

echo $encodedData;
?>
title=%D0%A1%D1%82%D0%B0%D1%82%D1%8C%D1%8F+%D0%BE+PHP&content=%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5+%D1%81+%26+%D0%B8+%3D+%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%B0%D0%BC%D0%B8&tags=php%2Cweb%2Cdevelopment
Сравнение с rawurlencode
Пример php
<?
$str = 'пробел и plus';
echo 'urlencode: ' . urlencode($str) . "\n";
echo 'rawurlencode: ' . rawurlencode($str);
?>
urlencode: %D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB+%D0%B8+plus
rawurlencode: %D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%20%D0%B8%20plus

PHP urlencode function comments

En
Urlencode URL-encodes string