ToolHub
View All Posts

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

URL-кодирование (также называемое процентным кодированием) — это фундаментальный механизм, обеспечивающий надёжную работу интернета. Каждый раз, когда вы вводите URL с пробелами, специальными символами или не-ASCII символами, ваш браузер незаметно кодирует их в формат, который может безопасно передаваться через интернет. Это руководство объясняет всё, что вам нужно знать о URL-кодировании, от основ до продвинутых тем и вопросов безопасности.

Что такое URL-кодирование?

URL-кодирование — это метод преобразования символов в формат, который может быть передан через интернет. Символы, не являющиеся частью разрешённого набора символов URL, заменяются знаком процента (%), за которым следуют две шестнадцатеричные цифры, представляющие значение символа в ASCII. Например, пробел становится %20, а знак вопроса становится %3F.

URL могут содержать только ограниченный набор символов: буквы (A-Z, a-z), цифры (0-9) и несколько специальных символов (-, _, ., ~). Любой символ вне этого набора должен быть закодирован. Без кодирования такие символы, как пробелы, не-ASCII буквы и знаки препинания, нарушили бы синтаксис URL или были бы неправильно интерпретированы серверами.

Структура URL

URL-кодирование работает путём замены каждого небезопасного символа на %XX, где XX — это шестнадцатеричное представление байтового значения символа в UTF-8. Для символов, требующих нескольких байтов в UTF-8, каждый байт кодируется отдельно, что приводит к последовательности, подобной %D0%9F (для русского символа П).

URL-кодирование доступно во всех языках программирования и необходимо для корректной обработки пользовательского ввода в URL.

Почему необходимо URL-кодирование

HTML-формы имеют особую связь с URL-кодированием, поскольку данные формы кодируются в URL при отправке через GET или в теле запроса при отправке через POST.

  1. Пробелы: пробелы в URL должны быть закодированы как %20. В параметрах запроса форм они также могут отображаться как +, но %20 является более надёжным вариантом.
  2. Специальные символы: такие символы, как &, ?, = и #, имеют специальное значение в URL и должны быть закодированы, когда используются как данные, а не как синтаксис URL.
  3. Не-ASCII символы: символы за пределами основного набора ASCII должны быть закодированы в UTF-8, а затем закодированы в процентах. Например, русское слово привет кодируется как %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82.

Зарезервированные и незарезервированные символы

URL-кодирование является мощным инструментом, но его неправильное использование может привести к трудноотлаживаемым ошибкам. Вот самые распространённые ошибки, которых следует избегать:

Двойное кодирование происходит, когда уже закодированная строка кодируется снова. Например, если вы кодируете «hello world», вы получаете «hello%20world». Если вы закодируете это снова, вы получите «hello%2520world» (знак % кодируется как %25). Это распространённая ошибка, когда несколько слоёв приложения кодируют один и тот же URL.

Как работает URL-кодирование

URL-кодирование пересекается с безопасностью несколькими способами. Хотя это не функция безопасности, неправильное кодирование может создавать уязвимости.

СимволКодированное значениеПримечанияЯзык
Пробел%20Самый распространённый закодированный символ!
%21Восклицательный знак"%22
Двойная кавычка#%23Решётка (якорь)
$%24Знак доллара%
%25Знак процента&%26
Амперсанд (разделитель параметров)+%2BЗнак плюс
,%2CЗапятая/
%2FКосая черта (разделитель пути):%3A
Двоеточие=%3DЗнак равно (пара ключ-значение)
?%3FВопросительный знак (начало запроса)@
%40Знак atJavaScriptencodeURIComponent()
decodeURIComponent()Pythonurllib.parse.quote()urllib.parse.unquote()
PHPurlencode()urldecode()application/x-www-form-urlencoded
GETПараметры в строке запроса URLmultipart/form-dataPOST
Загрузка файловapplication/x-www-form-urlencodedPOSTПараметры в теле запроса
@%4064 (0x40) Reserved (authority delimiter)
[%5B91 (0x5B) Reserved (IPv6 literal)
]%5D93 (0x5D) Reserved (IPv6 literal)

Справочник по URL-кодированию

Нужно закодировать или декодировать URL? Попробуйте наш бесплатный онлайн-инструмент URL Encoder / Decoder.

URL-кодирование в JavaScript

URL-кодирование (процентное кодирование) — это метод преобразования символов в безопасный для URL формат путём замены небезопасных символов на знак процента (%), за которым следуют две шестнадцатеричные цифры. Это гарантирует, что специальные символы, пробелы и не-ASCII символы могут быть безопасно переданы в URL без нарушения синтаксиса URL.

URL-кодирование в Python

encodeURI() предназначен для кодирования полного URL и сохраняет символы, имеющие специальное значение в URL, такие как /, ?, & и #. encodeURIComponent() кодирует отдельный компонент URL (например, значение параметра запроса) и кодирует все специальные символы, включая те, которые encodeURI сохраняет. Используйте encodeURIComponent() для значений параметров запроса и encodeURI() для полных URL.

URL-кодирование в PHP

Функция кодированияФункция декодированияТип формы
Context URLs and URIs HTML documents
Format %XX (percent + hex) &name; or &#NNN;
Example for < %3C&lt;
Example for & %26 &amp;
Example for " %22 &quot;
Purpose Safe URL transmission Prevent HTML injection
Specification RFC 3986 HTML Living Standard

В URL-кодировании пробелы становятся %20. В данных формы (application/x-www-form-urlencoded) пробелы становятся +. Это различие существует по историческим причинам, уходящим корнями в раннюю спецификацию HTML. При декодировании параметров запроса обрабатывайте оба варианта. При кодировании параметров запроса, %20 технически более корректен, но + широко принимается.

URL-кодирование в программировании

Используйте URL-кодирование всегда, когда включаете предоставленные пользователем данные в URL, особенно в параметрах запроса и компонентах пути. Также используйте его при создании URL программно, когда значения могут содержать специальные символы. Никогда не пропускайте кодирование для пользовательского ввода — это может сломать URL или создать уязвимости безопасности.

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

URL-кодирование напрямую не влияет на SEO, но неправильное кодирование, вызывающее неработающие URL, может навредить SEO, создавая ошибки сканирования. При использовании не-ASCII символов в URL, правильное кодирование гарантирует, что поисковые системы могут корректно сканировать и индексировать ваши URL. Используйте читаемые слова в URL, где это возможно, и полагайтесь на кодирование только для специальных символов.

// encodeURI - encodes a complete URL
// Preserves: :, /, ?, #, &, =, +, @, ;, ,, !, ~, *, ', (, )
const url = encodeURI("https://example.com/search?q=hello world");
// Result: "https://example.com/search?q=hello%20world"

// encodeURIComponent - encodes a URL component
// Encodes ALL special characters including URL delimiters
const param = encodeURIComponent("price=100&discount=20");
// Result: "price%3D100%26discount%3D20"

// Never use escape() - it is deprecated
// It does not handle Unicode correctly

encodeURIencodeURIComponentencodeURIencodeURIComponent when you are encoding a single parameter value.

GET и POST в формах

from urllib.parse import quote, quote_plus, urlencode

# quote - standard URL encoding (spaces as %20)
encoded = quote("hello world&more")
# Result: "hello%20world%26more"

# quote_plus - spaces become + instead of %20
encoded_plus = quote_plus("hello world")
# Result: "hello+world"

# urlencode - encodes a dictionary as a query string
params = {"q": "hello world", "lang": "en"}
query = urlencode(params)
# Result: "q=hello+world&lang=en"

Пробелы: + против %20

// urlencode - spaces become +
$encoded = urlencode("hello world&more");
// Result: "hello+world%26more"

// rawurlencode - RFC 3986 compliant (spaces as %20)
$raw = rawurlencode("hello world&more");
// Result: "hello%20world%26more"

URL-кодирование и HTML-формы

The space character has two common encodings, and understanding when to use each is important:

+application/x-www-form-urlencoded+ is a literal plus sign, not a space. Most server-side frameworks handle this correctly for query strings, but it can cause subtle bugs when encoding paths or working with custom URL schemes.

Распространённые ошибки

URL encoding has significant security implications that every web developer must understand.

Частичное кодирование

%2527%27' on the second pass. If a security filter only checks the first decode, it would miss the malicious character. This can bypass input validation, cross-site scripting (XSS) filters, and SQL injection protections.

<script>%253Cscript%253E<script>, executing the attack.

Кодирование всего URL

A common misconception is that URL encoding hides or protects data. It does not. URL encoding is trivially reversible; anyone can decode a percent-encoded string. Never use URL encoding as a substitute for encryption, authentication, or access control. Sensitive data like passwords, API keys, and personal information should never appear in URLs, encoded or not, because URLs are logged by browsers, servers, proxies, and can be visible in referrer headers.

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

/redirect?url=https%3A%2F%2Fevil.com. If the application does not validate the target URL after decoding, attackers can use this to redirect users to phishing sites. Always validate decoded URL values against an allowlist of permitted domains.

Инъекции через URL

../../etc/passwd%2e%2e%2f%2e%2e%2f%65%74%63%2f%70%61%73%73%77%64. Web servers must decode and normalize paths before checking for traversal attacks.

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

Что такое URL-кодирование?

When building URLs with dynamic query parameters, always encode the values:

const baseUrl = "https://api.example.com/search";
const query = "user input with special chars: & ? = #";
const url = `${baseUrl}?q=${encodeURIComponent(query)}`;
// Result: "https://api.example.com/search?q=user%20input%20with%20special%20chars%3A%20%26%20%3F%20%3D%20%23"

В чём разница между encodeURI и encodeURIComponent?

Path segments that contain special characters need encoding, but you must not encode the path separators:

const category = "electronics & gadgets";
const product = "USB-C cable (6ft)";
const url = `/products/${encodeURIComponent(category)}/${encodeURIComponent(product)}`;
// Result: "/products/electronics%20%26%20gadgets/USB-C%20cable%20(6ft)"

Почему пробелы становятся %20 или +?

const encoded = "hello%20world%3F%26%3D%23";
const decoded = decodeURIComponent(encoded);
// Result: "hello world?&=#"

Безопасность и URL-кодирование

Золотое правило: используйте encodeURIComponent() для значений параметров запроса и компонентов пути. Используйте encodeURI() для полных URL. Никогда не пропускайте кодирование для предоставленных пользователем данных в URL. И всегда декодируйте перед отображением пользователю.

Need to encode or decode URLs quickly? Try our free online URL encoder and decoder tools.

URL Encoder / DecoderDecode URL

Часто задаваемые вопросы

Когда следует использовать URL-кодирование?

URL encoding, also called percent-encoding, is a mechanism that converts characters into a format that can be safely transmitted in a URL. It replaces unsafe or reserved characters with a percent sign followed by two hexadecimal digits representing the character's byte value. For example, a space becomes %20 and a question mark becomes %3F.

Влияет ли URL-кодирование на SEO?

%20 is the URL-encoded representation of a space character. Spaces are not allowed in URLs because they can be ambiguous and break URL parsing. The percent sign followed by 20 represents the hexadecimal value 0x20, which is the ASCII code for a space. Some systems also use + for spaces in query strings, but %20 is the standard encoding.

What is the difference between URL encoding and HTML encoding?

URL encoding converts characters to percent-encoded format (%XX) for safe transmission in URLs. HTML encoding converts characters to entity references (&, <, etc.) for safe display in HTML documents. They serve different purposes: URL encoding is for URLs, HTML encoding is for HTML content. A value like < needs both: %3C in a URL and &lt; in HTML.

When should I use encodeURIComponent vs encodeURI?

Use encodeURI when encoding a complete URL, as it preserves URL structure characters like :, /, ?, &, and =. Use encodeURIComponent when encoding a single URL component value (like a query parameter), as it encodes ALL special characters including those that have structural meaning in URLs. Always use encodeURIComponent for query parameter values.

Can URL encoding be used for security?

URL encoding alone is not a security measure. It is a transport mechanism, not encryption or authentication. In fact, double encoding attacks can bypass security filters by encoding malicious input multiple times. Always validate and sanitize input on the server side, use parameterized queries for databases, and apply proper output encoding for the target context (HTML, URL, JavaScript).