رمزگذاری URL (که رمزگذاری درصدی هم نامیده میشود) مکانیزمی است برای کدگذاری اطلاعات در یک شناسه منبع یکنواخت (URI) بهگونهای که تنها کاراکترهای مجاز طبق RFC 3986 در رشته نهایی ظاهر شوند. هر کاراکتری که جزو کاراکترهای بدوننیاز به رمزگذاری (A–Z، a–z، 0–9، -، _، .، ~) نباشد، با یک علامت درصد بهدنبال دو رقم هگزادسیمال معادل مقدار بایت UTF-8 آن جایگزین میشود — برای مثال، فاصله به %20 و & به %26 تبدیل میشود.
رمزگذاری درصدی ضروری است چون URLها تنها میتوانند مجموعه محدودی از کاراکترهای ASCII را داشته باشند. هنگامی که یک URL شامل کاراکترهایی خارج از این مجموعه باشد — فاصلهها، حروف Unicode، نمادهایی مثل &، = یا / که بهعنوان مقادیر واقعی بهکار میروند نه جداکنندههای ساختاری — آن کاراکترها باید رمزگذاری شوند تا تجزیهگر URL آنها را اشتباه تفسیر نکند. این مسئله بهخصوص برای مقادیر query string حیاتی است، جایی که & یا = رمزگذارینشده ساختار پارامترها را خراب میکند.
چرا از این ابزار استفاده کنیم؟
فوری ببینید متن شما در هر دو حالت چگونه رمزگذاری میشود، با یک مقایسه زنده کنار هم — بدون نیاز به نوشتن کد برای بررسی موارد خاص.
⚡
پیشنمایش زنده
خروجی همزمان با تایپ شما بهروز میشود. ورودیهای مختلف را امتحان کنید و فوری ببینید کدام کاراکترها رمزگذاری میشوند و کدامها حفظ میشوند.
🔀
دو حالت
بین encodeURIComponent (برای مقادیر) و encodeURI (برای URLهای کامل) بدون ترک صفحه جابهجا شوید.
🔒
فقط سمت کلاینت
تمام رمزگذاریها بهصورت محلی در مرورگر شما اجرا میشوند. پارامترهای query حساس و توکنها هرگز به سرور ارسال نمیشوند.
📋
کپی با یک کلیک
خروجی رمزگذاریشده را با یک دکمه در کلیپبورد کپی کنید. آماده است تا مستقیماً در کد، ترمینال، یا نوار آدرس مرورگر جایگذاری شود.
نحوه استفاده از این رمزگذار URL آنلاین
بدون حساب کاربری، بدون نصب. متن خود را در فیلد ورودی جایگذاری یا تایپ کنید و نتیجه درصدیرمزگذاریشده فوراً ظاهر میشود. همه چیز در مرورگر شما اجرا میشود — دادههای شما هرگز دستگاه شما را ترک نمیکنند.
1
متن یا URL خود را جایگذاری کنید
هر رشتهای وارد کنید — یک مقدار پارامتر query، یک URL کامل، یک بخش مسیر، یا یک payload JSON. رمزگذار آن را کاراکتر به کاراکتر طبق RFC 3986 پردازش میکند.
2
حالت رمزگذاری را انتخاب کنید
encodeURIComponent را برای رمزگذاری مقادیر پارامترهای تکی انتخاب کنید (همه چیز جز کاراکترهای بدوننیاز به رمزگذاری را رمزگذاری میکند). encodeURI را برای رمزگذاری یک URL کامل با حفظ کاراکترهای ساختاری مثل ://?#&= انتخاب کنید.
3
خروجی رمزگذاریشده را کپی کنید
رشته درصدیرمزگذاریشده فوراً ظاهر میشود. روی کپی کلیک کنید تا نتیجه را بگیرید و مستقیماً در فراخوانی API، action فرم، یا فایل تنظیمات جایگذاری کنید.
4
در صورت نیاز برگردانید
اشتباه کردید یا میخواهید نتیجه را تأیید کنید؟ با یک کلیک به ابزار رمزگشای URL بروید تا رمزگذاری را معکوس کنید.
کدام کاراکترها رمزگذاری میشوند؟
RFC 3986 کاراکترهای URL را به دو دسته تقسیم میکند: کاراکترهای بدوننیاز به رمزگذاری (هرگز رمزگذاری نمیشوند) و کاراکترهای رزروشده (معنای ویژه دارند — بسته به زمینه رمزگذاری یا حفظ میشوند). جدول زیر نشان میدهد که دو تابع JavaScript چگونه با کاراکترهای کلیدی رفتار میکنند:
کاراکتر
معنا در URL
encodeURIComponent
encodeURI
Space
word separator
%20
%20
+
plus sign
%2B
%2B
/
path separator
%2F
/ (kept)
?
query start
%3F
? (kept)
#
fragment
%23
# (kept)
&
param separator
%26
& (kept)
=
param value
%3D
= (kept)
@
auth separator
%40
@ (kept)
:
scheme / port
%3A
: (kept)
%
percent literal
%25
%25
~
unreserved
~ (kept)
~ (kept)
-_.~
unreserved set
kept as-is
kept as-is
encodeURIComponent در برابر encodeURI
JavaScript دو تابع رمزگذاری با رفتار بسیار متفاوت ارائه میدهد. انتخاب نادرست یکی از رایجترین باگهای مدیریت URL است:
encodeURIComponent()
همه چیز را بهجز مجموعه کاراکترهای بدوننیاز (A–Z a–z 0–9 - _ . ~) رمزگذاری میکند. این گزینه مناسب برای رمزگذاری مقادیر تکی پارامترهای query، بخشهای مسیر، یا هر مقداری است که در داخل یک URL جاسازی میشود. کاراکترهای /، ?، #، & و تمام کاراکترهای رزروشده دیگر را رمزگذاری میکند.
encodeURI()
کل ساختار URL را با رمزگذارینشده نگهداشتن کاراکترهای رزروشده (: / ? # [ ] @ ! $ & ' ( ) * + , ; =) حفظ میکند. تنها زمانی از این تابع استفاده کنید که یک URL کامل با ساختاری دارید که میخواهید آن را حفظ کنید و فقط نیاز دارید کاراکترهای غیر-ASCII یا غیرمجاز درون آن را رمزگذاری کنید.
موارد استفاده رایج
پارامترهای Query String
مقادیر پارامترها را قبل از افزودن به URL رمزگذاری کنید: name=علی%20احمدی بهجای name=علی احمدی. فاصلهها و کاراکترهای خاص رمزگذارینشده، تجزیهگرهای URL را خراب و نتایج غیرمنتظرهای ایجاد میکنند.
ساخت درخواستهای API
REST APIها نیازمند پارامترهای query رمزگذاریشده صحیح هستند. رمزگذاری مقادیر با encodeURIComponent از تزریق پارامترهای اضافی از طریق کاراکترهایی مثل & و = موجود در مقادیر جلوگیری میکند.
ارسال دادههای فرم
فرمهای HTML بهطور پیشفرض دادهها را بهصورت application/x-www-form-urlencoded ارسال میکنند. درک رمزگذاری درصدی کمک میکند دیباگ کنید مرورگر چه چیزی میفرستد و سرور چه چیزی دریافت میکند.
بخشهای مسیر با کاراکترهای خاص
نامهای فایل یا شناسههایی که شامل فاصله، اسلش یا کاراکترهای Unicode هستند، هنگام استفاده بهعنوان بخشهای مسیر URL باید درصدی رمزگذاری شوند: /files/my%20document.pdf.
OAuth و توکنهای احراز هویت
OAuth 1.0a و برخی پروتکلهای احراز هویت نیاز دارند رشته پایه از نامها و مقادیر پارامترهای درصدیرمزگذاریشده بر اساس یک الگوریتم نرمالسازی دقیق ساخته شود.
لینکهای عمیق و URLهای اشتراکگذاری
هنگام تولید URLهای قابلاشتراک که محتوای کاربر (جستارهای جستجو، وضعیت فیلترها، مختصات) را جاسازی میکنند، تمام مقادیر پویا را رمزگذاری کنید تا از لینکهای شکسته و XSS از طریق دستکاری URL جلوگیری شود.
نمونههای کد
نحوه رمزگذاری URL رشتهها در زبانها و محیطهای محبوب:
JavaScript (browser / Node.js)
// Encode a query parameter value (most common case)
encodeURIComponent('hello world & more') // → "hello%20world%20%26%20more"
// Encode a complete URL (preserves ://?#& structure)
encodeURI('https://example.com/path?q=hello world') // → "https://example.com/path?q=hello%20world"
// Build a query string safely
const params = new URLSearchParams({ q: 'hello world', lang: 'en' })
const url = `https://example.com/search?${params}` // uses + for spaces
Python
from urllib.parse import quote, urlencode, quote_plus
# Encode a path segment or query value
quote('hello world & more') # → 'hello%20world%20%26%20more'
# Encode for application/x-www-form-urlencoded (space → +)
quote_plus('hello world') # → 'hello+world'
# Build a query string
urlencode({'q': 'hello world', 'lang': 'en'}) # → 'q=hello+world&lang=en'
Node.js (URL API)
const url = new URL('https://example.com/search')
url.searchParams.set('q', 'hello world & more')
url.searchParams.set('lang', 'en')
console.log(url.toString())
// → https://example.com/search?q=hello+world+%26+more&lang=en
ابزارهای مختلفی میتوانند متن را درصدی رمزگذاری کنند، اما از نظر کنترل، حریم خصوصی و زمینه متفاوتند.
این ابزار
مبتنی بر مرورگر، فوری، خصوصی. از هر دو حالت encodeURIComponent و encodeURI پشتیبانی میکند. هیچ دادهای به هیچ سروری ارسال نمیشود. ورودی کامل Unicode را مدیریت میکند.
نوار آدرس مرورگر
مرورگرها URLها را هنگام جایگذاری بهصورت خودکار رمزگذاری میکنند، اما تنها بهصورت جزئی — بسیاری از کاراکترهای خاص را برای خوانایی حفظ میکنند. برای رمزگذاری مقادیر پارامتر مناسب نیست.
URLSearchParams / urllib
رویکرد برنامهنویسی صحیح برای ساخت URL در JavaScript یا Python. از این ابزار برای رمزگذاری سریع یکبار یا تأیید خروجی کدتان استفاده کنید.
سوالات متداول
تفاوت %20 و + برای فاصله چیست؟
هر دو نمایانگر فاصله هستند، اما در زمینههای مختلف. %20 نمایش استاندارد درصدیرمزگذاریشده فاصله است و در همه جای URL معتبر است. علامت + تنها در فرمت application/x-www-form-urlencoded (ارسال فرمهای HTML) نشانگر فاصله است. در مسیر URL یا یک مقدار query خام، + یک علامت جمع واقعی است، نه فاصله. برای حداکثر سازگاری از %20 استفاده کنید.
چه زمانی باید از encodeURIComponent در مقابل encodeURI استفاده کنم؟
از encodeURIComponent برای مقادیر تکی (پارامترهای query، بخشهای مسیر، قطعات hash) استفاده کنید. از encodeURI تنها زمانی استفاده کنید که یک URL کامل دارید و میخواهید ساختار آن را حفظ کنید. یک اشتباه رایج استفاده از encodeURI روی مقدار query است — این تابع & و = را رمزگذارینشده میگذارد و query string را خراب میکند.
آیا رمزگذاری URL کاراکترهای Unicode را مدیریت میکند؟
بله. کاراکترهای غیر-ASCII ابتدا به نمایش بایتی UTF-8 خود تبدیل میشوند، سپس هر بایت درصدی رمزگذاری میشود. برای مثال، علامت یورو € (U+20AC) به %E2%82%AC — سه بایت UTF-8 آن — رمزگذاری میشود. هر دو encodeURIComponent و encodeURI این کار را در تمام مرورگرهای مدرن بهدرستی انجام میدهند.
آیا رمزگذاری مضاعف مشکل است؟
بله. اگر یک رشته رمزگذاریشده را دوباره رمزگذاری کنید، %20 به %2520 تبدیل میشود (خود % به %25 رمزگذاری میشود). همیشه مقادیر خام را رمزگذاری کنید، نه مقادیری که قبلاً رمزگذاری شدهاند. در صورت شک، ابتدا رمزگشایی کنید، سپس دوباره رمزگذاری کنید.
کدام کاراکترها در URL همیشه امن هستند؟
کاراکترهای بدوننیاز به رمزگذاری تعریفشده در RFC 3986 همیشه امن هستند و هرگز نیاز به رمزگذاری ندارند: حروف بزرگ A–Z، حروف کوچک a–z، ارقام 0–9، خطتیره (-)، زیرخط (_)، نقطه (.) و تیلد (~). همه موارد دیگر هنگام استفاده بهعنوان مقدار (نه جداکننده ساختاری) باید درصدی رمزگذاری شوند.
چرا برخی URLها شامل هگز بزرگ (%2F) و برخی دیگر کوچک (%2f) هستند؟
هر دو معتبر هستند. RFC 3986 مشخص میکند که دنبالههای درصدیرمزگذاریشده به حروف کوچک و بزرگ حساس نیستند، بنابراین %2F و %2f معادل هستند. با این حال، همان RFC توصیه میکند برای سازگاری از ارقام هگز بزرگ استفاده شود. اکثر مرورگرها و کتابخانهها حروف بزرگ تولید میکنند.
آیا این ابزار URL کامل را رمزگذاری میکند یا فقط پارامترها را؟
هر دو. از حالت encodeURIComponent برای رمزگذاری مقادیر تکی پارامترهای query (رایجترین مورد استفاده) استفاده کنید. از حالت encodeURI برای رمزگذاری یک URL کامل با حفظ کاراکترهای ساختاری مثل ://، ?، # و & استفاده کنید.
آیا محدودیت طولی برای رمزگذاری وجود دارد؟
محدودیت سمت سرور وجود ندارد — ابزار کاملاً در مرورگر شما اجرا میشود. محدودیتهای عملی به حافظه مرورگر شما بستگی دارند. برای ورودیهای بسیار بزرگ یا پردازش دستهای، از encodeURIComponent در یک اسکریپت استفاده کنید.