ابزار رایگان · بدون ثبت‌نام

فقط در مرورگر شما؛ چیزی ارسال نمی‌شود

URL Encode و Decode آنلاین (کدگذاری درصدی)

متن یا آدرس را به شکل %XX کدگذاری کنید یا رشتهٔ کدگذاری‌شده را به متن خوانا برگردانید. متن فارسی با UTF-8 درست تبدیل می‌شود، تفاوت encodeURIComponent و encodeURI کنار ابزار توضیح داده شده و کد % نامعتبر با جایگاه دقیقش گزارش می‌شود.

جهت تبدیل
ورودی چیست؟

مقدار پارامتر: همه‌چیز جز A–Z a–z 0–9 - _ . ! ~ * ' ( ) کدگذاری می‌شود، از جمله / ? & = + # :. برای مقدار یک پارامتر query یا یک تکه از مسیر.

آدرس کامل: علاوه بر حروف و اعداد، نویسه‌های ساختاری ; , / ? : @ & = + $ # دست‌نخورده می‌مانند تا آدرس معتبر بماند؛ فقط فاصله، حروف فارسی و نویسه‌های غیرمجاز کدگذاری می‌شوند.

نتیجه همزمان با تایپ ساخته می‌شود؛ Esc ورودی را پاک می‌کند.

نمونه‌ها

راهنمای کامل

راهنمای URL Encode: کدگذاری درصدی، متن فارسی در آدرس و خطاهای رایج

آدرس‌های وب فقط مجموعهٔ محدودی از نویسه‌ها را بدون دردسر می‌پذیرند. فاصله، علامت &، علامت سؤال، حروف فارسی و ده‌ها نویسهٔ دیگر باید پیش از قرار گرفتن در آدرس به شکل %XX درآیند. به این کار URL Encode یا کدگذاری درصدی می‌گویند. ابزار URL Encode ایران‌کلاد متن را در هر دو جهت تبدیل می‌کند، دو حالت متفاوت برای مقدار پارامتر و آدرس کامل دارد و همه‌چیز را در مرورگر شما انجام می‌دهد. در این راهنما می‌خوانید کدگذاری درصدی دقیقاً چه می‌کند، کدام حالت را کجا به کار ببرید، متن فارسی در آدرس چه شکلی پیدا می‌کند و چرا علامت + و کدگذاری دوباره این‌قدر دردسر می‌سازند.

۱۰ بخش حدود ۸ دقیقه مطالعه

فهرست مطالب

URL Encode چیست و چرا لازم است؟

کدگذاری درصدی در استاندارد RFC 3986 تعریف شده است. هر نویسه‌ای که نباید مستقیم در آدرس بیاید، ابتدا به بایت‌های UTF-8 تبدیل می‌شود و هر بایت به شکل علامت درصد و دو رقم شانزده‌شانزدهی نوشته می‌شود. فاصله می‌شود %20، علامت & می‌شود %26 و علامت سؤال می‌شود %3F. مرورگر و سرور در طرف دیگر همین کار را برعکس انجام می‌دهند و متن اصلی را بازمی‌سازند.

دلیل اصلی این کار این است که بعضی نویسه‌ها در آدرس معنای ساختاری دارند. علامت سؤال شروع query string را نشان می‌دهد، & پارامترها را از هم جدا می‌کند، = نام و مقدار را و # شروع بخش fragment را. اگر مقدار یک پارامتر خودش شامل & باشد و کدگذاری نشود، سرور آن را پایان پارامتر و شروع پارامتر بعدی می‌فهمد و داده به‌هم می‌ریزد.

  • ساختن لینک جست‌وجو با عبارتی که فاصله یا علامت دارد
  • قرار دادن یک آدرس کامل به‌عنوان مقدار پارامتر بازگشت
  • ارسال متن فارسی در query string یک API
  • خواندن آدرس‌های کدگذاری‌شده در لاگ سرور
  • عیب‌یابی خطای ۴۰۴ روی مسیرهایی با نویسهٔ خاص
  • ساخت لینک‌های رهگیری کمپین با پارامترهای متنی

مقدار پارامتر یا آدرس کامل؟ تفاوت encodeURIComponent و encodeURI

ابزار دو حالت دارد که دقیقاً دو تابع استاندارد جاوااسکریپت را اجرا می‌کنند. حالت «مقدار پارامتر» از encodeURIComponent استفاده می‌کند و جز حروف لاتین، اعداد و نشانه‌های بی‌خطر خط تیره، زیرخط، نقطه، ~، !، *، کوتیشن تکی و پرانتزها همه‌چیز را کدگذاری می‌کند؛ از جمله / و ? و & و =. این حالت برای مقدار یک پارامتر یا یک بخش از مسیر مناسب است.

حالت «آدرس کامل» از encodeURI استفاده می‌کند و نویسه‌هایی را که ساختار آدرس را می‌سازند دست‌نخورده می‌گذارد تا یک آدرس کامل بعد از کدگذاری هنوز آدرس معتبری باشد. این حالت برای وقتی است که آدرسی با فاصله یا حروف فارسی دارید و می‌خواهید فقط همان بخش‌ها اصلاح شوند. با تغییر حالت، نتیجه بی‌درنگ با تابع جدید دوباره ساخته می‌شود و توضیح کوتاه زیر نوار ابزار هم نشان می‌دهد کدام نویسه‌ها دست‌نخورده می‌مانند.

نویسهمقدار پارامتر (encodeURIComponent)آدرس کامل (encodeURI)
فاصله%20%20
/ و :کدگذاری می‌شود (%2F و %3A)دست‌نخورده
? و # و &کدگذاری می‌شود (%3F، %23، %26)دست‌نخورده
= و +کدگذاری می‌شود (%3D، %2B)دست‌نخورده
حروف فارسیبایت‌های UTF-8 به شکل %XXبایت‌های UTF-8 به شکل %XX
حروف لاتین، اعداد، - _ . ~دست‌نخوردهدست‌نخورده

قاعدهٔ ساده: اگر فقط مقدار یک پارامتر را می‌سازید، «مقدار پارامتر». اگر کل آدرس را دارید و فقط می‌خواهید معتبر شود، «آدرس کامل». هرگز یک آدرس کامل را با حالت «مقدار پارامتر» کدگذاری نکنید و بعد آن را به‌عنوان آدرس باز نکنید؛ همهٔ اسلش‌هایش از بین می‌روند.

بازگشت به فهرست مطالب

اجزای یک آدرس وب و اینکه کدام بخش کدگذاری می‌خواهد

برای انتخاب درست حالت کدگذاری، باید بدانید با کدام بخش آدرس سروکار دارید. یک آدرس کامل از چند جزء ساخته شده است: طرح (scheme) مثل https، نام میزبان، پورت اختیاری، مسیر، query string بعد از علامت سؤال و fragment بعد از علامت #. هر جزء قواعد خودش را دارد و نویسه‌ای که در یک جزء مجاز است، ممکن است در جزء دیگر معنای ویژه داشته باشد.

نام میزبان با کدگذاری درصدی نوشته نمی‌شود؛ دامنه‌های فارسی به شکل punycode درمی‌آیند که با xn-- شروع می‌شود. مسیر از بخش‌هایی تشکیل شده که با / از هم جدا می‌شوند و هر بخش را باید جداگانه با حالت «مقدار پارامتر» کدگذاری کرد. در query string، نام و مقدار هر پارامتر جداگانه کدگذاری می‌شود و علامت‌های = و & بین آن‌ها دست‌نخورده می‌مانند. fragment هم هرگز به سرور فرستاده نمی‌شود و فقط در مرورگر استفاده می‌شود.

جزء آدرسنمونهروش کدگذاری
نام میزبانshop.example.comبدون کدگذاری درصدی؛ دامنهٔ فارسی به شکل punycode
مسیر/blog/سلام-دنیاهر بخش جداگانه با «مقدار پارامتر»
query string?q=قیمت سرور&page=2نام و مقدار هر پارامتر جداگانه با «مقدار پارامتر»
fragment#faqفقط سمت مرورگر؛ به سرور نمی‌رسد

بازگشت به فهرست مطالب

متن فارسی در آدرس: چرا سه کلمه این‌قدر طولانی می‌شود؟

هر حرف فارسی در UTF-8 دو بایت جا می‌گیرد و هر بایت در کدگذاری درصدی سه نویسه می‌شود. پس هر حرف فارسی به شش نویسه تبدیل می‌شود. کلمهٔ «سلام» با چهار حرف به %D8%B3%D9%84%D8%A7%D9%85 تبدیل می‌شود که ۲۴ نویسه است. شمارندهٔ بالای هر کادر تعداد نویسه و بایت ورودی و خروجی را نشان می‌دهد و همین اختلاف را آشکار می‌کند؛ برای متن فارسی خروجی معمولاً چند برابر ورودی است.

مرورگرهای امروزی آدرس‌های فارسی را در نوار آدرس به شکل خوانا نشان می‌دهند، ولی هنگام کپی کردن یا ارسال به سرور، نسخهٔ کدگذاری‌شده منتقل می‌شود. به همین دلیل وقتی لینکی با نامک فارسی را در پیام‌رسان می‌چسبانید، رشتهٔ طولانی %D8... می‌بینید. اگر می‌خواهید بدانید یک آدرس طولانی دقیقاً چه می‌گوید، حالت «بازگردانی» را انتخاب کنید و آن را در کادر ورودی بچسبانید تا به متن خوانا برگردد.

نامک فارسی برای سئو اشکالی ندارد، ولی طول آدرس کدگذاری‌شده را چند برابر می‌کند و در برخی سامانه‌ها، از لاگ‌ها تا ابزارهای قدیمی، خواناتر بودن نامک لاتین مزیت است. هر کدام را انتخاب کنید، در کل سایت یکدست بمانید.

بازگشت به فهرست مطالب

علامت + یا %20؟ تفاوت کدگذاری آدرس و فرم

یکی از رایج‌ترین سردرگمی‌ها این است که فاصله گاهی %20 و گاهی + نوشته می‌شود. در کدگذاری استاندارد آدرس طبق RFC 3986، فاصله %20 است. ولی وقتی فرم HTML با روش پیش‌فرض application/x-www-form-urlencoded ارسال می‌شود، فاصله به + تبدیل می‌شود و خود علامت + به %2B. برای همین در query string‌هایی که از فرم آمده‌اند، علامت + معمولاً به معنای فاصله است.

این ابزار به‌طور پیش‌فرض کدگذاری استاندارد آدرس را انجام می‌دهد: فاصله را %20 می‌نویسد و هنگام بازگردانی، علامت + را همان + باقی می‌گذارد. اگر رشته‌ای از فرم یا لاگ دارید که در آن فاصله‌ها + شده‌اند، در حالت «مقدار پارامتر» گزینهٔ «+ به‌جای فاصله» را روشن کنید؛ آن‌وقت هنگام کدگذاری فاصله به + تبدیل می‌شود و هنگام بازگردانی هر + پیش از بازگردانی به فاصله تبدیل می‌شود. اگر این گزینه خاموش باشد و ورودی بازگردانی + داشته باشد، ابزار یادآوری کوتاهی نشان می‌دهد. برعکس، اگر مقداری واقعاً شامل + است، مثل شماره تلفن با پیش‌شمارهٔ ⁦+98⁩، حتماً آن را با حالت «مقدار پارامتر» کدگذاری کنید تا به %2B تبدیل شود و سمت سرور فاصله خوانده نشود.

بازگشت به فهرست مطالب

کدگذاری دوباره و خطاهای رایج decode

کدگذاری دوباره وقتی رخ می‌دهد که رشته‌ای که قبلاً کدگذاری شده، یک بار دیگر کدگذاری شود. علامت درصد خودش به %25 تبدیل می‌شود و %20 به %2520 می‌رسد. نتیجه این است که سرور به‌جای فاصله، عبارت %20 را می‌بیند. اگر در لاگ یا آدرس %25 دیدید، تقریباً همیشه نشانهٔ کدگذاری دوباره است؛ یک بار بازگردانی کنید و ببینید آیا هنوز %XX باقی مانده است. ابزار این حالت را خودش تشخیص می‌دهد و دکمهٔ «یک بار دیگر بازگردانی کن» را نشان می‌دهد؛ اگر هم در حالت کدگذاری متنی بچسبانید که از قبل کدگذاری شده، پیش از ساختن %25 هشدار می‌دهد.

اگر رشتهٔ کدگذاری‌شده علامت درصدی داشته باشد که دو رقم معتبر شانزده‌شانزدهی بعد از آن نیست، مثل 100% یا %G1، بازگردانی متوقف می‌شود و ابزار جایگاه دقیق همان علامت درصد را گزارش می‌کند. همین‌طور اگر کدهای %XX درست نوشته شده باشند ولی بایت‌های UTF-8 معتبری نسازند، مثلاً وقتی نیمی از کد یک حرف فارسی هنگام کپی جا افتاده یا متن با Windows-1256 کدگذاری شده، جایگاه آن دنباله نشان داده می‌شود. یک تفاوت ظریف دیگر: در حالت «آدرس کامل»، تابع decodeURI کدهایی مثل %2F، %3F و %26 را که نویسه‌های ساختاری آدرس‌اند به نویسهٔ اصلی برنمی‌گرداند؛ برای دیدن کامل متن، حالت «مقدار پارامتر» را انتخاب کنید.

نشانهعلت محتملراه حل
%2520 در آدرسکدگذاری دوبارهفقط یک بار، در آخرین مرحله کدگذاری کنید
+ به‌جای فاصلهرشتهٔ برآمده از فرمگزینهٔ «+ به‌جای فاصله» را روشن کنید
خطای decodeعلامت درصد بدون دو رقم معتبرعلامت % را به %25 تبدیل کنید
%2F باقی می‌ماندبازگردانی در حالت «آدرس کامل»حالت «مقدار پارامتر» را انتخاب کنید

بازگشت به فهرست مطالب

معادل این ابزار در زبان‌های برنامه‌نویسی

هر زبان دو نوع تابع دارد: یکی برای کدگذاری استاندارد آدرس و یکی برای کدگذاری فرم. اشتباه گرفتن این دو، منشأ بیشتر باگ‌های مربوط به + و فاصله است. جدول زیر معادل حالت «مقدار پارامتر» این ابزار و گزینهٔ «+ به‌جای فاصله» را در چند زبان رایج نشان می‌دهد.

زبانکدگذاری آدرس (فاصله = %20)کدگذاری فرم (فاصله = +)
JavaScriptencodeURIComponentURLSearchParams
PHPrawurlencodeurlencode و http_build_query
Pythonurllib.parse.quote با safe خالیurllib.parse.quote_plus و urlencode
Gourl.PathEscapeurl.QueryEscape

در Python تابع quote به‌صورت پیش‌فرض اسلش را کدگذاری نمی‌کند. برای رفتاری مثل حالت «مقدار پارامتر»، پارامتر safe را رشتهٔ خالی بگذارید.

بازگشت به فهرست مطالب

نکته‌های امنیتی: پارامتر بازگشت، لاگ‌ها و داده‌های حساس

کدگذاری درصدی رمزگذاری نیست و هیچ چیزی را پنهان نمی‌کند؛ هر کسی می‌تواند آن را در یک لحظه برگرداند. آدرس‌ها، شامل query string، در تاریخچهٔ مرورگر، لاگ سرورها و پروکسی‌ها ثبت می‌شوند و ممکن است در سرآیند Referer به سایت‌های دیگر هم برسند. پس رمز عبور، توکن دسترسی یا اطلاعات شخصی را در آدرس نگذارید، حتی اگر کدگذاری شده باشد.

وقتی آدرس بازگشت را به‌عنوان پارامتر می‌گیرید، مثلاً پس از ورود کاربر، مقدار decodeشده را با فهرستی از مسیرها یا دامنه‌های مجاز مقایسه کنید. مهاجمان با کدگذاری، آدرس‌های خارجی را طوری پنهان می‌کنند که در نگاه اول بی‌خطر به نظر برسند و از آن برای فیشینگ استفاده می‌کنند. برای بررسی پاسخ و ریدایرکت‌های یک آدرس، بررسی هدرهای HTTP مفید است.

بازگشت به فهرست مطالب

حریم خصوصی و محدودیت‌های ابزار URL Encode

تبدیل کاملاً با توابع داخلی جاوااسکریپت مرورگر انجام می‌شود. سرور ایران‌کلاد فقط خود صفحه را می‌فرستد و متنی که در کادرها می‌نویسید یا می‌چسبانید در هیچ درخواستی ارسال یا ذخیره نمی‌شود. بنابراین می‌توانید آدرس‌های داخلی یا پارامترهای آزمایشی را بدون نگرانی بررسی کنید.

محدودیت‌ها: ابزار آدرس را به اجزای آن تجزیه نمی‌کند و پارامترها را جدا نمایش نمی‌دهد؛ اگر کل یک query string را با چند پارامتر در حالت «مقدار پارامتر» کدگذاری کنید، علامت‌های & و = بین پارامترها هم کدگذاری می‌شوند، پس هر مقدار را جداگانه کدگذاری کنید. شمارنده‌ها هم تعداد نویسه و هم تعداد بایت UTF-8 را نشان می‌دهند. متن واردشده در آدرس صفحه یا حافظهٔ مرورگر ذخیره نمی‌شود و با تازه کردن صفحه پاک می‌شود. برای داده‌های دودویی یا توکن‌ها، Base64 و برای خواندن محتوای توکن‌های ورود، دیکودر JWT ابزار مناسب‌تری است.

بازگشت به فهرست مطالب

ابزارهای مکمل و میزبانی برنامه‌های وب

اگر با API کار می‌کنید، معمولاً بعد از کدگذاری آدرس سراغ بدنهٔ پاسخ می‌روید؛ ابزار JSON پاسخ را مرتب و اعتبارسنجی می‌کند و تست Regex برای استخراج بخشی از آدرس‌ها در لاگ کمک می‌کند. فهرست کامل ابزارهای رایگان در صفحهٔ ابزارها آمده است.

برای اجرای برنامهٔ وب یا API خودتان، سرورهای ابری ایران‌کلاد در تهران با صورت‌حساب ساعتی و تومانی در دسترس‌اند؛ پلن mini از ۱٬۱۰۰ تومان در ساعت شروع می‌شود و جزئیات همهٔ پلن‌ها در صفحهٔ قیمت‌ها آمده است.

بازگشت به فهرست مطالب بازگشت به ابتدای راهنما

پرسش و پاسخ،  ۱۰ پرسش

سؤالات متداول

پاسخ پرسش خود را پیدا نکردید؟ با پشتیبانی در تماس باشید.

URL Encode چیست؟
کدگذاری درصدی نویسه‌هایی که نباید مستقیم در آدرس بیایند. هر نویسه به بایت‌های UTF-8 تبدیل و هر بایت به شکل % و دو رقم شانزده‌شانزدهی نوشته می‌شود؛ مثلاً فاصله %20 می‌شود.
تفاوت encodeURIComponent و encodeURI چیست؟
حالت «مقدار پارامتر» با encodeURIComponent همه‌چیز جز حروف، اعداد و چند نشانهٔ بی‌خطر را کدگذاری می‌کند و برای مقدار پارامتر مناسب است. حالت «آدرس کامل» با encodeURI نویسه‌های ساختاری مثل / و ? و # را نگه می‌دارد و برای آدرس کامل است.
چرا متن فارسی بعد از کدگذاری این‌قدر طولانی می‌شود؟
هر حرف فارسی در UTF-8 دو بایت است و هر بایت سه نویسه می‌شود؛ پس هر حرف به شش نویسه می‌رسد. «سلام» به %D8%B3%D9%84%D8%A7%D9%85 تبدیل می‌شود.
فاصله باید %20 باشد یا +؟
در کدگذاری استاندارد آدرس %20 است. علامت + برای فاصله فقط در کدگذاری فرم HTML به کار می‌رود. این ابزار به‌طور پیش‌فرض فاصله را %20 می‌نویسد؛ با گزینهٔ «+ به‌جای فاصله» رفتار فرم را شبیه‌سازی می‌کند و هنگام بازگردانی + را به فاصله تبدیل می‌کند.
چرا decode خطا می‌دهد؟
معمولاً به خاطر علامت درصدی که دو رقم معتبر شانزده‌شانزدهی بعد از آن نیست، مثل 100%. علامت درصد واقعی باید به شکل %25 نوشته شود. دلیل دوم کدهای %XX است که بایت‌های UTF-8 معتبری نمی‌سازند، مثلاً وقتی بخشی از کد یک حرف فارسی جا افتاده. ابزار در هر دو حالت جایگاه دقیق مشکل را در پیام خطا می‌نویسد.
%2520 در آدرس یعنی چه؟
یعنی رشته دو بار کدگذاری شده است: %20 یک بار دیگر کدگذاری شده و درصد آن به %25 تبدیل شده است. کدگذاری را فقط یک بار و در آخرین مرحله انجام دهید.
چرا در حالت آدرس کامل کد %2F به اسلش برنمی‌گردد؟
تابع decodeURI کدهای نویسه‌های ساختاری آدرس مثل %2F، %3F و %26 را عمداً decode نمی‌کند تا ساختار آدرس تغییر نکند. برای دیدن متن کامل، حالت «مقدار پارامتر» را انتخاب کنید.
آیا متنی که وارد می‌کنم به سرور فرستاده می‌شود؟
خیر. تبدیل با توابع داخلی جاوااسکریپت در مرورگر شما انجام می‌شود و متن در هیچ درخواستی ارسال یا ذخیره نمی‌شود.
آیا URL Encode برای پنهان کردن اطلاعات کافی است؟
خیر. کدگذاری درصدی رمزگذاری نیست و هر کسی آن را برمی‌گرداند. رمز عبور، توکن و اطلاعات شخصی را در آدرس نگذارید، چون در لاگ‌ها و تاریخچهٔ مرورگر ثبت می‌شوند.
معادل این ابزار در PHP و Python چیست؟
در PHP تابع rawurlencode معادل حالت «مقدار پارامتر» است و urlencode فاصله را + می‌کند. در Python از urllib.parse.quote با safe خالی استفاده کنید؛ quote_plus فاصله را + می‌نویسد.

پاسخ پرسش خود را پیدا نکردید؟ با پشتیبانی در تماس باشید.

سرور ابری

سرور ابری ایران‌کلاد در کمتر از ۶۰ ثانیه آماده می‌شود؛ با دیسک NVMe SSD، پورت اختصاصی ۱۰ گیگابیت و صورت‌حساب ساعتی تومانی، از ۱٬۱۰۰ تومان در ساعت.