انکود و دیکد URL
متن را برای قرار گرفتن در URL ایمن کنید یا دنبالههایی مانند %20 را دوباره به نویسههای خوانا برگردانید. این ابزار از توابع encodeURIComponent، encodeURI و decodeURIComponent خودِ مرورگر شما استفاده میکند، پارامترهای کوئری را در یک جدول فهرست میکند و هیچ دادهای به سرور نمیفرستد.
۰ نویسه · ۰ واژه · ۰ خط
۰ نویسه · ۰ واژه · ۰ خط
کاملاً در همین زبانهٔ مرورگر اجرا میشود. متن شما هرگز آپلود یا ذخیره نمیشود.
هر تابع چه چیزی را escape میکند
با خود توابع مرورگر محاسبه شده است. encodeURIComponent حروف، ارقام و این علامتها را دستنخورده میگذارد: ! ' ( ) * - . _ ~
| نویسه | encodeURIComponent | encodeURI |
|---|---|---|
(فاصله) | %20 | %20 |
! | ! | ! |
" | %22 | %22 |
# | %23 | # |
$ | %24 | $ |
% | %25 | %25 |
& | %26 | & |
' | ' | ' |
( | ( | ( |
) | ) | ) |
* | * | * |
+ | %2B | + |
, | %2C | , |
/ | %2F | / |
: | %3A | : |
; | %3B | ; |
= | %3D | = |
? | %3F | ? |
@ | %40 | @ |
[ | %5B | %5B |
] | %5D | %5D |
{ | %7B | %7B |
} | %7D | %7D |
| | %7C | %7C |
\ | %5C | %5C |
^ | %5E | %5E |
` | %60 | %60 |
< | %3C | %3C |
> | %3E | %3E |
~ | ~ | ~ |
- | - | - |
_ | _ | _ |
. | . | . |
é | %C3%A9 | %C3%A9 |
€ | %E2%82%AC | %E2%82%AC |
😀 | %F0%9F%98%80 | %F0%9F%98%80 |
رمزگذاری درصدی و نویسههای رزروشدهٔ RFC 3986
یک URL فقط میتواند شامل مجموعهای محدود از نویسههای ASCII باشد. RFC 3986، مشخصات سال 2005 برای نحو URI، این نویسهها را به دو گروه تقسیم میکند. نویسههای رزرونشده (unreserved) یعنی A–Z، a–z، 0–9 و چهار علامت - . _ ~ هرگز نیازی به کدگذاری ندارند. نویسههای رزروشده (reserved) نقش مشخصی دارند: جداکنندههای عمومی : / ? # [ ] @ طرح، میزبان، مسیر، کوئری و بخش (fragment) را از هم جدا میکنند و جداکنندههای فرعی ! $ & ' ( ) * + , ; = موارد داخل آنها را جدا میکنند، همانطور که & و = در رشتهٔ کوئری عمل میکنند. هر نویسهٔ دیگری، و هر نویسهٔ رزروشدهای که بهعنوان داده معمولی به کار رفته باشد، باید با درصدکدگذاری (percent-encoding) نوشته شود.
درصدکدگذاری هر بایت را بهصورت % و پس از آن دو رقم شانزدهی مینویسد. متن ابتدا به UTF-8 تبدیل میشود، بنابراین فاصله به %20، نویسهٔ é (دو بایت) به %C3%A9 و یک ایموجی به چهار گروه %XX تبدیل میشود. به همین دلیل جستوجوی «café & bar» در لینک به شکل caf%C3%A9%20%26%20bar درمیآید: نویسهٔ & کدگذاری میشود تا سرور آن را آغاز پارامتر جدید نپندارد.
encodeURIComponent، encodeURI و رمزگشایی
encodeURIComponent برای یک بخش مجزا، مانند مقدار کوئری، یک قطعهٔ مسیر یا نشانی بازگشتی که بهعنوان پارامتر ارسال میشود، انتخاب درست است. این تابع همهچیز را بهجز نویسههای رزرونشده و ! ' ( ) * کدگذاری میکند؛ این نویسهها را جاوااسکریپت به دلایل تاریخی دستنخورده میگذارد. encodeURI (کل URL) فرض میکند ورودی یک نشانی کامل است و نویسههای رزروشده را حفظ میکند، بنابراین در https://example.com/a b?q=1 فقط فاصله کدگذاری میشود. استفاده از encodeURI برای مقدار یک پارامتر خطایی کلاسیک است: & یا # درون مقدار باقی میماند و URL را خراب میکند.
رمزگشایی هر دو تابع را برعکس میکند. فرمهای HTML که با GET ارسال میشوند از قالب قدیمیتر application/x-www-form-urlencoded استفاده میکنند که در آن فاصله بهجای %20 بهصورت + نوشته میشود؛ برای این موارد گزینهٔ Treat + as a space را فعال نگه دارید و وقتی علامت مثبت واقعی اهمیت دارد، مثلاً در شمارهٔ تلفن، آن را غیرفعال کنید. اگر ورودی شامل % بدون دو رقم شانزدهی بعد از آن یا بایتهایی نامعتبر در UTF-8 باشد، رمزگشایی بهجای حدس زدن با یک پیام روشن شکست میخورد. وقتی متن شامل رشتهٔ کوئری باشد، پارامترهای آن رمزگشاییشده در جدولی زیر ابزار نمایش داده میشوند. برای دادههای باینری در URL، Base64url جایگزین معمول است.
پرسشهای متداول
- فاصله در URL باید %20 باشد یا علامت بهعلاوه (+)؟
- در مسیرها و بر اساس RFC 3986، فاصله %20 است. شکل + فقط داخل رشتههای کوئری که مانند فرمهای HTML کدگذاری شدهاند به معنی فاصله است، پس %20 در همهجا انتخاب امن است.
- چرا در URL من %2520 ظاهر شده است؟
- دوبار کدگذاری شده است. در مرحلهٔ اول فاصله به %20 تبدیل شده و در مرحلهٔ دوم خود % به %25 کدگذاری شده است. یک بار رمزگشایی کنید تا لایهٔ اضافه برداشته شود و مقادیر را فقط در یک نقطه از کد کدگذاری کنید.
- کدام نویسهها هرگز به رمزگذاری درصدی نیاز ندارند؟
- مجموعهٔ رزرونشدهٔ RFC 3986: حروف A تا Z بهصورت بزرگ و کوچک، ارقام 0 تا 9 و نویسههای خط تیره، نقطه، زیرخط و تیلدا.
- آیا URL میتواند بدون رمزگذاری حروف غیرانگلیسی داشته باشد؟
- مرورگرها آنها را نمایش میدهند، اما در انتقال واقعی هر نویسهٔ غیر ASCII در مسیر یا کوئری بهصورت UTF-8 درصدکدگذاریشده ارسال میشود. نام دامنهها از سامانهای جدا به نام Punycode استفاده میکنند که آنها را به برچسبهایی با پیشوند xn-- تبدیل میکند.
- چرا رمزگشایی خطای دنبالهٔ نامعتبر میدهد؟
- متن شامل % بدون دو رقم شانزدهی بعد از آن است، مانند «100%» بهصورت واقعی، یا بایتها به UTF-8 نامعتبر رمزگشایی میشوند. پیش از رمزگشایی، علامتهای % اضافی را به %25 کدگذاری کنید.