URL এনকোডার / ডিকোডার
নতুনটেক্সট পার্সেন্ট-এনকোড বা ডিকোড করুন এবং query string পার্স করুন — সব আপনার ব্রাউজারে।
Special characters reference
| Character | Encoded (%XX) | Notes |
|---|---|---|
| space | %20 | Also encoded as + in HTML form query strings |
| & | %26 | Query param separator — encode in values |
| = | %3D | Key-value separator in query strings |
| ? | %3F | Marks the start of a query string |
| # | %23 | Fragment identifier |
| / | %2F | Path separator |
| : | %3A | Protocol / port separator |
| @ | %40 | Username delimiter in URLs |
| + | %2B | Literal plus sign (+ in query string = space) |
| % | %25 | Percent itself — encode to avoid ambiguity |
| € | %E2%82%AC | UTF-8 multi-byte (3 bytes) |
| © | %C2%A9 | UTF-8 multi-byte (2 bytes) |
Per-language code snippets
Copy-ready snippets for JavaScript, Python, C#, PowerShell, Java and Go.
// Encode a single query value (recommended)
const encoded = encodeURIComponent('hello world & co.');
// → 'hello%20world%20%26%20co.'
// Decode
const decoded = decodeURIComponent('hello%20world%20%26%20co.');
// → 'hello world & co.'
// Encode a full URL (leaves : / ? & # intact)
const safeUrl = encodeURI('https://example.com/search?q=hello world');
// → 'https://example.com/search?q=hello%20world' from urllib.parse import quote, unquote, urlencode
# Encode a single value (%20 for spaces)
encoded = quote('hello world & co.')
# → 'hello%20world%20%26%20co.'
# Decode
decoded = unquote('hello%20world%20%26%20co.')
# → 'hello world & co.'
# Encode a query dict (uses + for spaces — form encoding)
qs = urlencode({'q': 'hello world', 'page': '2'})
# → 'q=hello+world&page=2'
# quote_plus encodes spaces as + (match HTML form encoding)
plus = quote_plus('hello world')
# → 'hello+world' // Encode a single value (spaces → %20)
string encoded = Uri.EscapeDataString("hello world & co.");
// → "hello%20world%20%26%20co."
// Decode
string decoded = Uri.UnescapeDataString("hello%20world%20%26%20co.");
// → "hello world & co."
// Older System.Web API (spaces → +, form encoding):
// HttpUtility.UrlEncode("hello world") → "hello+world" # .NET method — works in PS 5+ and PowerShell Core
$encoded = [Uri]::EscapeDataString('hello world & co.')
# → 'hello%20world%20%26%20co.'
$decoded = [Uri]::UnescapeDataString('hello%20world%20%26%20co.')
# → 'hello world & co.'
# Alternate via System.Web (Desktop PS only):
Add-Type -AssemblyName System.Web
$enc2 = [System.Web.HttpUtility]::UrlEncode('hello world')
# → 'hello+world' import java.net.URLEncoder;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
// Encode (URLEncoder uses + for spaces — form encoding)
String encoded = URLEncoder.encode("hello world & co.", StandardCharsets.UTF_8);
// → "hello+world+%26+co."
// Decode
String decoded = URLDecoder.decode("hello+world+%26+co.", StandardCharsets.UTF_8);
// → "hello world & co." import "net/url"
// QueryEscape: spaces become +
encoded := url.QueryEscape("hello world & co.")
// → "hello+world+%26+co."
decoded, err := url.QueryUnescape("hello+world+%26+co.")
// → "hello world & co.", nil
// PathEscape: spaces become %20
pathSafe := url.PathEscape("hello world & co.")
// → "hello%20world%20&%20co." Runs entirely in your browser. Nothing is uploaded.
ফ্রি অনলাইন URL এনকোডার ও ডিকোডার
এই URL এনকোডার ও ডিকোডার টেক্সটকে পার্সেন্ট-এনকোডেড রূপে রূপান্তর করে — অথবা উল্টো কাজটি করে — সরাসরি আপনার ব্রাউজারেই। আপনার টেক্সট পেস্ট করুন, Encode বা Decode বেছে নিন, Component বা Full URI নিয়ম নির্বাচন করুন, আর ফলাফল লাইভ আপডেট হবে। কিছুই আপলোড হয় না; প্রতিটি অপারেশন সম্পূর্ণভাবে আপনার ব্রাউজারে সেই একই বিল্ট-ইন JavaScript ফাংশন দিয়ে চলে যা আপনার কোডও ব্যবহার করে।
ওয়েব ডেভেলপমেন্টে পার্সেন্ট-এনকোডিং এড়ানো যায় না। স্পেস, অ্যাম্পারস্যান্ড, সমান চিহ্ন এবং নন-ASCII অক্ষর — সবকিছুকেই URL-এ নিরাপদে বসানোর আগে এসকেপ করতে হয়। আপনি একটি API রিকোয়েস্ট তৈরি করছেন, একটি ট্র্যাকিং লিংক ডিবাগ করছেন, নাকি একটি সার্ভার লগ পড়ছেন — এই টুল সব ধরনের প্রান্তিক ক্ষেত্র সামলায়, যার মধ্যে আছে মাল্টি-বাইট UTF-8 অক্ষর, ত্রুটিপূর্ণ সিকোয়েন্স এবং + বনাম %20 স্পেসের দ্বৈততা।
encodeURIComponent বনাম encodeURI — কোন নিয়ম ব্যবহার করবেন?
encodeURIComponent হলো আলাদা কোয়েরি ভ্যালু, পাথ সেগমেন্ট বা URL-এ বসানো যেকোনো স্ট্রিংয়ের জন্য সঠিক পছন্দ। এটি প্রায় প্রতিটি বিশেষ অক্ষর এনকোড করে — যেমন ?, &, =, /, # এবং : — যাতে ভ্যালুটি URL-এর কাঠামো ভেঙে ফেলতে না পারে। উদাহরণ: 'hello world & page=2' হয়ে যায় 'hello%20world%20%26%20page%3D2'।
encodeURI তৈরি করা হয়েছে একটি সম্পূর্ণ URL কে না-ভেঙে এনকোড করার জন্য। এটি কাঠামোগত অক্ষরগুলো অক্ষত রাখে (: / ? # &) যাতে URL কাজ করতে থাকে, তবুও স্পেস ও নন-ASCII অক্ষর এনকোড করে দেয়। সন্দেহ হলে, ভ্যালু হিসেবে যা কিছু বসাচ্ছেন তার জন্য Component নিয়ম বেছে নিন — প্রায় প্রতিটি ওয়েব ফ্রেমওয়ার্কে এটিই নিরাপদ ডিফল্ট।
স্পেস %20 বনাম + — ফর্ম-এনকোডিংয়ের পার্থক্য
একটি URL-এ স্পেস এনকোড করার দুটি বৈধ উপায় আছে। URL পাথে (?-এর আগের অংশে) RFC 3986 অনুযায়ী %20 লাগে। HTML ফর্ম কোয়েরি স্ট্রিংয়ে, পুরোনো application/x-www-form-urlencoded ফরম্যাটে ঐতিহাসিক সংক্ষিপ্ততার কারণে স্পেসকে + হিসেবে এনকোড করা হয় — আর GET দিয়ে ফর্ম সাবমিট করলে ব্রাউজার এখনও তা-ই পাঠায়।
দুটোই 'স্পেস' বোঝায়, কিন্তু শুধু নিজ নিজ প্রসঙ্গে। URL পাথে একটি + মানে আক্ষরিক প্লাস চিহ্ন; কোয়েরি স্ট্রিংয়ে একটি + মানে স্পেস। কোয়েরি ভ্যালুতে আক্ষরিক একটি প্লাসকে অবশ্যই %2B হিসেবে এনকোড করতে হবে, নয়তো তা ভুলভাবে পড়া হবে। Decode মোডের + as space টগলটি decodeURIComponent চালানোর আগে + কে স্পেস দিয়ে বদলে ফর্ম-এনকোডেড ইনপুট সামলায় — ফর্ম সাবমিশন বা OAuth টোকেন পরীক্ষার সময় কাজে লাগে।
CyberChef ও অন্যান্য URL এনকোডিং টুলের সাথে তুলনা
CyberChef (GCHQ-এর তৈরি) শক্তিশালী, কিন্তু একটি 'recipe' পাইপলাইন ধারণাকে ঘিরে গড়া — আপনি একাধিক অপারেশন একসাথে যুক্ত করেন। শুধু URL এনকোড বা ডিকোডের জন্য, আপনাকে অপারেশনটি খুঁজে, recipe-তে টেনে এনে, তারপর ইনপুট প্রসেস করতে হয়। জটিল রূপান্তরের জন্য এটি চমৎকার; কিন্তু দ্রুত একটি এনকোড/ডিকোডের জন্য প্রয়োজনের চেয়ে ধীর।
urldecoder.org বা meyerweb.com/eric/tools/dencoder/-এর মতো অন্যান্য অনলাইন টুল সরল, কিন্তু বিজ্ঞাপন দেখায়, প্রতিটি অপারেশনে পুরো পেজ রিলোড করে, এবং ভাষা-ভিত্তিক কোড স্নিপেট দেয় না। এই টুল প্রতিটি কীস্ট্রোকে সঙ্গে সঙ্গে ফলাফল আপডেট করে, Component এবং Full URI দুই নিয়মই সামলায়, সাধারণ এনকোডেড অক্ষরের একটি রেফারেন্স টেবিল রাখে, এবং JavaScript, Python, C#, PowerShell, Java ও Go-তে কপি-রেডি কোড দেখায় — সবই কিছু আপলোড না করে।
বিশেষ অক্ষরের দ্রুত রেফারেন্স
ওয়েব ডেভেলপমেন্টে সবচেয়ে সাধারণভাবে এনকোড হওয়া অক্ষরগুলো: space → %20 (বা কোয়েরি স্ট্রিংয়ে +), & → %26, = → %3D, ? → %3F, # → %23, / → %2F, : → %3A, @ → %40, + → %2B, % → %25। মাল্টি-বাইট UTF-8 অক্ষর একাধিক সিকোয়েন্সে বিস্তৃত হয়: € → %E2%82%AC, é → %C3%A9।
যে অক্ষরগুলো কখনওই এনকোড হয় না সেগুলো হলো unreserved সেট: A–Z ও a–z অক্ষর, 0–9 অঙ্ক, এবং চারটি চিহ্ন - _ . ~। বাকি সবকিছু — প্রতিটি নন-ASCII অক্ষরসহ — একটি স্ট্যান্ডার্ড-সম্মত URL-এ অবশ্যই পার্সেন্ট-এনকোড করতে হবে।
JavaScript, Python, C#, PowerShell ও Java-তে URL এনকোডিং
প্রতিটি বড় ভাষায় এর জন্য একটি বিল্ট-ইন ফাংশন আছে। JavaScript / Node.js-এ: encodeURIComponent(str) ও decodeURIComponent(str) — কোনো import লাগে না। Python-এ: urllib.parse.quote(str) ও unquote(str); সম্পূর্ণ কোয়েরি স্ট্রিংয়ের জন্য urlencode(dict)। C#-এ: System namespace থেকে Uri.EscapeDataString(str) ও Uri.UnescapeDataString(str)। PowerShell-এ: [Uri]::EscapeDataString(str), যা PS 5+ ও PowerShell Core-এ পাওয়া যায়। Java-তে: URLEncoder.encode(str, StandardCharsets.UTF_8)।
ভাষা-ভিত্তিক স্নিপেট প্যানেলে JavaScript, Python, C#, PowerShell, Java ও Go-এর জন্য কপি-রেডি কোড আছে, যাতে আপনি সঠিক কল-টি তাৎক্ষণিকভাবে আপনার প্রজেক্টে বসাতে পারেন — সাথে প্রতিটি ভাষার স্ট্যান্ডার্ড লাইব্রেরির জন্য + বনাম %20 স্পেসের আচরণ নিয়ে নোট।
RFC 3986: একটি URL-এর গঠন ও তার অক্ষর নিয়ম
RFC 3986 — Uniform Resource Identifier-এর নির্ধারক IETF স্পেসিফিকেশন — একটি URL কে কতগুলো উপাদানের ক্রম হিসেবে সংজ্ঞায়িত করে: scheme://userinfo@host:port/path?query#fragment। প্রতিটি উপাদান স্বাধীনভাবে পার্স হয়, এবং প্রতিটির নিজস্ব কিছু অক্ষর আছে যা সিনট্যাক্সের অর্থ বহন করে। scheme-এর পরের কোলন (https:) একটি ডিলিমিটার; একটি পাথ সেগমেন্টের ভেতরের কোলন নিছক ডেটা। একই বাইট অবস্থানভেদে ভিন্ন অর্থ বহন করতে পারে বলেই স্পেসিফিকেশন সিনট্যাক্সের অংশ ও এসকেপ করতে হয় এমন অক্ষরের মধ্যে একটি স্পষ্ট সীমারেখা টানে।
স্পেসিফিকেশন দুই শ্রেণির অক্ষর সংজ্ঞায়িত করে। Unreserved অক্ষর — ৬৬টি কোড পয়েন্ট A–Z, a–z, 0–9, হাইফেন, আন্ডারস্কোর, ডট ও টিল্ড — URL-এ সর্বত্র নিরাপদ এবং কখনও পার্সেন্ট-এনকোড করা উচিত নয়; এগুলো এনকোড করলে টেকনিক্যালি ভিন্ন কিন্তু সমতুল্য একটি URL তৈরি হয়। Reserved অক্ষর — ১৮টি কোড পয়েন্ট : / ? # [ ] @ ! $ & ' ( ) * + , ; = — সিনট্যাক্সের অর্থ বহন করে এবং ডিলিমিটার নয় বরং ডেটা হিসেবে এলে অবশ্যই পার্সেন্ট-এনকোড করতে হবে। যেমন, একটি কোয়েরি ভ্যালুর ভেতরের একটি # কে fragment-এর শুরু হিসেবে পড়া হবে, তার পরের সবকিছু নীরবে বাদ পড়ে যাবে।
এই সীমারেখা বোঝা বাস্তবে গুরুত্বপূর্ণ। একটি কোয়েরি প্যারামিটার ভ্যালুতে যদি একটি কাঁচা & বসান, পার্সার সেখানে এটিকে দুটি প্যারামিটারে ভাগ করে ফেলবে। একটি পাথ সেগমেন্টের ভেতরের কাঁচা / ডিরেক্টরি সীমার মতো দেখায়। একটি পাথের ভেতরের কাঁচা ? কোয়েরি স্ট্রিংয়ের শুরুর মতো দেখায়। ডেটা হিসেবে আসা প্রতিটি reserved অক্ষরকে অবশ্যই এনকোড করতে হবে — এটিই পার্সেন্ট-এনকোডিংয়ের পুরো উদ্দেশ্য, আর এ কারণেই একটি ডকুমেন্ট থেকে অন্ধভাবে URL কপি করে কোডে বসালে এত ঘন ঘন নীরব বাগ তৈরি হয়।
পার্সেন্ট-এনকোডিংয়ের কৌশল: %XX, UTF-8 বাইট ও মাল্টি-বাইট সিকোয়েন্স
পার্সেন্ট-এনকোডিং কাজ করে বাইট স্তরে, অক্ষর স্তরে নয়। প্রতিটি অনিরাপদ বাইট লেখা হয় একটি পার্সেন্ট চিহ্নের পর সেই বাইটের মান বোঝানো ঠিক দুটি বড় হাতের হেক্সাডেসিমাল অঙ্ক দিয়ে। সাধারণ সিঙ্গল-বাইট উদাহরণ: একটি স্পেস (বাইট 0x20) হয় %20, একটি প্লাস চিহ্ন (0x2B) হয় %2B, একটি at-চিহ্ন (0x40) হয় %40, একটি হ্যাশ (0x23) হয় %23, একটি ফরোয়ার্ড স্ল্যাশ (0x2F) হয় %2F। ASCII অক্ষরগুলো সবই সিঙ্গল-বাইট বলে প্রতিটি ঠিক একটি %XX টোকেন তৈরি করে।
নন-ASCII অক্ষরের জন্য প্রয়োজন প্রথমে UTF-8 এনকোডিং, তারপর প্রতিটি ফলাফল বাইটের পার্সেন্ট-এনকোডিং। উচ্চারণচিহ্নযুক্ত অক্ষর é হলো Unicode কোড পয়েন্ট U+00E9। UTF-8-এ এটি দুটি বাইটে এনকোড হয়: 0xC3 ও 0xA9, তাই পার্সেন্ট-এনকোডেড রূপ %C3%A9। চীনা অক্ষর 中 (U+4E2D) তিনটি UTF-8 বাইটে 0xE4 0xB8 0xAD এনকোড হয়ে %E4%B8%AD তৈরি করে। 😀 (U+1F600)-এর মতো একটি ইমোজির জন্য চারটি UTF-8 বাইট লাগে এবং তা %F0%9F%98%80-তে বিস্তৃত হয়। এ কারণেই কখনও ধরে নেবেন না যে একটি %XX সিকোয়েন্স একটিমাত্র অক্ষরে ডিকোড হয় — পরপর সিকোয়েন্সের গুচ্ছ খুঁজুন এবং একটি UTF-8 সিকোয়েন্স হিসেবে সেগুলো একসাথে ডিকোড করুন।
JavaScript-এর দুটি এনকোডিং ফাংশনের পার্থক্য সরাসরি RFC 3986-এর অক্ষর শ্রেণি থেকে আসে। encodeURIComponent() ৬৬টি unreserved অক্ষর ছাড়া প্রতিটি অক্ষর এনকোড করে, ফলে URL-এ বসানো যেকোনো ভ্যালুর জন্য এটি নিরাপদ — কোয়েরি প্যারামিটার ভ্যালু, পাথ সেগমেন্ট, হ্যাশ ভ্যালু। encodeURI() অতিরিক্তভাবে ১৮টি reserved অক্ষরসহ # সংরক্ষণ করে যাতে সামগ্রিক URL কাঠামো এনকোডিংয়ের পরেও টিকে থাকে; শুধু তখনই এটি ব্যবহার করুন যখন আপনার কাছে একটি সম্পূর্ণ URL আছে যা হালকাভাবে এনকোড করতে চান, আলাদা ভ্যালু নয়। এদের গুলিয়ে ফেলা — encodeURIComponent দিয়ে একটি পুরো URL এনকোড করা — সব স্ল্যাশ, কোলন ও প্রশ্নবোধক চিহ্ন ধ্বংস করে দেবে।
সাধারণ URL এনকোডিং বাগ: ডাবল-এনকোডিং, + বিভ্রান্তি ও নন-ব্রেকিং স্পেস
ডাবল-এনকোডিং হলো প্রোডাকশন সিস্টেমে সবচেয়ে ঘন ঘন ঘটা এনকোডিং বাগ। এটি ঘটে যখন ইতিমধ্যে এনকোড হওয়া একটি স্ট্রিং দ্বিতীয়বার এনকোড করা হয়। একটি স্পেস %20-তে এনকোড হয়; %20 কে দ্বিতীয়বার এনকোড করলে % হয়ে যায় %25, তৈরি হয় %2520। সার্ভার এটিকে একবার ডিকোড করলে সে পায় %20 স্ট্রিং, একটি স্পেস নয়। একটি URL-এ আক্ষরিক পার্সেন্ট চিহ্ন বোঝাতে আপনাকে অবশ্যই তা %25 হিসেবে এনকোড করতে হবে — এটি সঠিক ও ইচ্ছাকৃত — কিন্তু আপনার পাইপলাইন যদি দুই স্তরে ভ্যালু এনকোড করে (একবার ORM-এ, একবার HTTP ক্লায়েন্টে) তাহলে আপনি নীরবে ডেটা নষ্ট করবেন। সমাধান হলো নিশ্চিত করা যে এনকোডিং ঠিক একটি স্তরে ঘটে, যেখানে URL একত্রিত হয় তার সবচেয়ে কাছে।
প্লাস-চিহ্নের দ্বৈততা হলো বাগের দ্বিতীয় বারবার-ফিরে-আসা উৎস। ওয়েব সার্ভার কোয়েরি স্ট্রিংয়ে + কে স্পেস হিসেবে ডিকোড করে কারণ HTML-এর application/x-www-form-urlencoded ফরম্যাট এই রীতি ব্যবহার করে — কিন্তু পাথ সেগমেন্টে তারা + কে স্পেস হিসেবে ডিকোড করে না, যেখানে একটি + সবসময় আক্ষরিক প্লাস। আপনি যদি Python-এর quote_plus() বা JavaScript-এর ফর্ম-ডেটা API (যা ফর্ম-এনকোডিং রীতি ব্যবহার করে) দিয়ে একটি পাথ সেগমেন্ট এনকোড করেন, স্পেস হয়ে যায় + এবং যা একটি বৈধ পাথ হওয়ার কথা তার জন্য সার্ভার একটি 404 দেয়। পাথ সেগমেন্টে সবসময় %20 ব্যবহার করুন এবং + শুধু application/x-www-form-urlencoded কোয়েরি স্ট্রিংয়ের জন্য রাখুন। এর অনুসিদ্ধান্ত: একটি কোয়েরি ভ্যালুতে আক্ষরিক একটি + কে অবশ্যই %2B হতে হবে, নয়তো তা স্পেস হিসেবে ডিকোড হবে।
আরও দুটি সূক্ষ্ম সমস্যা সাধারণ ফাঁদগুলোর তালিকা সম্পূর্ণ করে। প্রথমত, হেক্স কেস: RFC 3986 বলে পার্সেন্ট-এনকোডেড ট্রিপলেট কেস-অসংবেদনশীল, তাই %2F ও %2f সমতুল্য — কিন্তু কিছু লিগ্যাসি API বা সিগনেচার-যাচাই স্কিম বাইট-স্তরে স্ট্রিং তুলনা করে এবং ছোট হাতের হেক্স প্রত্যাখ্যান করে। সবসময় বড় হাতের হেক্স আউটপুট দিন (JavaScript-এর বিল্ট-ইন ফাংশন তা-ই করে; Python-এর urllib.parse.quote-ও করে)। দ্বিতীয়ত, নন-ব্রেকিং স্পেস (Unicode U+00A0) একটি সাধারণ স্পেসের (U+0020) সমান নয়। একটি সাধারণ স্পেস %20-তে এনকোড হয়; একটি নন-ব্রেকিং স্পেস, UTF-8-এ 0xC2 0xA0 বাইট হিসেবে এনকোড হয়ে, %C2%A0-তে এনকোড হয়। ওয়ার্ড-প্রসেসিং সফটওয়্যার বা রিচ-টেক্সট এডিটর থেকে টেক্সট কপি-পেস্ট করলে প্রায়ই নন-ব্রেকিং স্পেস ঢুকে পড়ে যা পর্দায় হুবহু একই দেখায় কিন্তু সম্পূর্ণ ভিন্ন পার্সেন্ট-এনকোডেড স্ট্রিং তৈরি করে, ফলে স্ট্রিং তুলনা ও ক্যাশ লুকআপ ব্যর্থ হয়।
আন্তর্জাতিক ডোমেইন নাম, Punycode ও IDN হোমোগ্রাফ হুমকি
যেখানে পার্সেন্ট-এনকোডিং একটি URL-এর পাথ, কোয়েরি ও fragment অংশ সামলায়, সেখানে host (ডোমেইন নাম) অংশটি সম্পূর্ণ ভিন্ন একটি এনকোডিং স্কিম ব্যবহার করে যার নাম Punycode। DNS ASCII-র জন্য ডিজাইন করা হয়েছিল, তাই নন-ASCII ডোমেইন নাম — যাকে Internationalized Domain Names (IDNs) বলে — DNS-এ খোঁজার আগে একটি ASCII-সঙ্গতিপূর্ণ এনকোডিংয়ে রূপান্তরিত হয়। অ্যালগরিদমটি xn-- প্রিফিক্সযুক্ত লেবেল তৈরি করে: জার্মান ডোমেইন münchen.de হয় xn--mnchen-3ya.de; জাপানি 東京.jp হয় xn--wgv71a309e.jp। রূপান্তরটি RFC 3492-তে সংজ্ঞায়িত এবং ব্রাউজার ও অপারেটিং সিস্টেম স্বচ্ছভাবে সামলায় — ব্যবহারকারী নিজ ভাষার নাম টাইপ করেন এবং ব্রাউজার DNS রিকোয়েস্টের আগে তা অনুবাদ করে।
IDN একটি গুরুত্বপূর্ণ নিরাপত্তা দুর্বলতা নিয়ে আসে যা IDN হোমোগ্রাফ আক্রমণ নামে পরিচিত। অনেক Unicode অক্ষর ASCII অক্ষর থেকে দৃশ্যত আলাদা করা যায় না: সিরিলিক а (U+0430) দেখতে ল্যাটিন a (U+0061)-এর হুবহু; গ্রিক ο (U+03BF) দেখতে ল্যাটিন o-র হুবহু। একজন আক্রমণকারী pаypal.com-এর মতো একটি ডোমেইন রেজিস্টার করতে পারে যেখানে а-টি সিরিলিক, একটি বিশ্বাসযোগ্য ফিশিং সাইট তৈরি করতে পারে, এবং ব্রাউজার বারের URL-টি সাধারণ চোখে খাঁটি দেখায়। এর বিরুদ্ধে সুরক্ষা দিতে ব্রাউজার হিউরিস্টিক প্রয়োগ করে: একটি ডোমেইন যদি স্ক্রিপ্ট মেশায় (একই লেবেলে ল্যাটিন ও সিরিলিক) বা এমন একটি TLD-র হয় যা নিরাপদ-অক্ষর নীতি প্রকাশ করেনি, তাহলে ব্রাউজার নিজ ভাষার বদলে Punycode রূপ (xn--pypal-4ve.com) দেখায়, ফলে প্রতিস্থাপনটি দৃশ্যমান হয়। IDN-এ অপ্ট-ইন করা রেজিস্টার্ড TLD থেকে আসা সিঙ্গল-স্ক্রিপ্ট ডোমেইন নিজ ভাষায় দেখানো হয়।
ডেভেলপারদের জন্য বাস্তব শিক্ষা হলো host ও path আলাদাভাবে এনকোড হয় এবং কখনও এদের গুলিয়ে ফেলা যাবে না। একটি ডোমেইন নাম পার্সেন্ট-এনকোড করবেন না — তাতে আবর্জনা DNS কোয়েরি তৈরি হবে। একটি পাথে Punycode প্রয়োগ করবেন না — পাথ কেবল পার্সেন্ট-এনকোডিং ব্যবহার করে। ব্যবহারকারী-প্রদত্ত ইনপুট থেকে প্রোগ্রামগতভাবে একটি URL তৈরি করার সময়, স্ট্রিং জোড়ার বদলে একটি URL-পার্সিং লাইব্রেরি ব্যবহার করুন (JavaScript-এ WHATWG URL কনস্ট্রাক্টর, Python-এ urllib.parse.urlsplit ইত্যাদি)। এই লাইব্রেরিগুলো প্রতিটি উপাদানে স্বয়ংক্রিয়ভাবে সঠিক এনকোডিং প্রয়োগ করে এবং ত্রুটিপূর্ণ আউটপুট ও ইনজেকশন আক্রমণ উভয় থেকেই সুরক্ষা দেয়।
Frequently asked questions
URL এনকোডিং কী?
URL এনকোডিং (যাকে পার্সেন্ট-এনকোডিংও বলা হয়) একটি URL-এ অনিরাপদ অক্ষরগুলোকে একটি % চিহ্ন এবং তার পরে দুটি হেক্সাডেসিমাল অঙ্কে রূপান্তর করে। যেমন, একটি স্পেস হয় %20, একটি অ্যাম্পারস্যান্ড হয় %26 এবং একটি হ্যাশ হয় %23। এটি নিশ্চিত করে যে ক্যারেক্টার সেট নির্বিশেষে প্রতিটি URL যেকোনো ব্রাউজার, HTTP হেডার বা সার্ভারে বৈধ থাকে। এটি ছাড়া, স্পেস বা বিশেষ অক্ষরযুক্ত URL ভেঙে যেত বা সার্ভার ভুলভাবে বুঝত।
URL এনকোডিংয়ে %20 মানে কী?
%20 হলো একটি স্পেস অক্ষরের পার্সেন্ট-এনকোডেড রূপ। 20 হলো ASCII 32 (স্পেস)-এর হেক্সাডেসিমাল মান। তাই 'hello%20world' URL-টি ফিরে ডিকোড হয়ে হয় 'hello world'। HTML ফর্ম কোয়েরি স্ট্রিংয়ে স্পেসের জন্য আপনি মাঝে মাঝে %20-এর বদলে + দেখবেন — কোয়েরি স্ট্রিংয়ে দুটোর একই অর্থ, কিন্তু URL পাথে নয়।
URL-এনকোডেড কী করে?
URL এনকোডিং অনিরাপদ অক্ষরগুলোকে তাদের %XX এসকেপ সিকোয়েন্স দিয়ে বদলে যেকোনো টেক্সটকে একটি URL-এ অন্তর্ভুক্ত করার মতো নিরাপদ করে তোলে। এটি ছাড়া, স্পেস, অ্যাম্পারস্যান্ড, সমান চিহ্ন ও নন-ASCII অক্ষরের মতো অক্ষর URL পার্সিং ভেঙে দিত। ডিকোডিং প্রক্রিয়াটি উল্টে দেয়, %XX সিকোয়েন্সকে ফিরে তাদের মূল অক্ষরে রূপান্তর করে — ট্র্যাকিং লিংক, API রেসপন্স ও লগ ফাইল পড়তে উপকারী।
কীভাবে একটি স্ট্রিং URL-এনকোড করব?
উপরের ইনপুট বক্সে আপনার টেক্সট পেস্ট করুন, Encode মোড নির্বাচন করুন এবং Component নিয়ম বেছে নিন। এনকোড হওয়া সংস্করণটি সঙ্গে সঙ্গে দেখা যায়। যেমন, 'hello world & co.' হয়ে যায় 'hello%20world%20%26%20co.' — প্রতিটি স্পেস ও বিশেষ অক্ষর তার %XX সিকোয়েন্স দিয়ে বদলে যায়। কোনো অ্যাকাউন্ট লাগে না, কোনো আপলোড নেই — টুলটি আপনার ব্রাউজারের বিল্ট-ইন ফাংশন দিয়ে এনকোড করে।
কীভাবে একটি স্ট্রিং URL-ডিকোড করব?
মোড টগলটি Decode-এ পাল্টান, আপনার পার্সেন্ট-এনকোডেড টেক্সট পেস্ট করুন, আর সাধারণ টেক্সট সঙ্গে সঙ্গে দেখা যায়। যেমন, 'caf%C3%A9%3F' ডিকোড হয়ে হয় 'café?'। ইনপুটে যদি একটি ত্রুটিপূর্ণ সিকোয়েন্স থাকে (যেমন দুটি হেক্স অঙ্ক অনুসরণ না করা একটি বিচ্ছিন্ন %), টুলটি সঠিক ত্রুটি জানায় যাতে আপনি তা খুঁজে ঠিক করতে পারেন।
encodeURI ও encodeURIComponent-এর মধ্যে পার্থক্য কী?
encodeURIComponent হলো আলাদা কোয়েরি ভ্যালু বা পাথ সেগমেন্টের জন্য — এটি প্রায় সবকিছুই এনকোড করে, যার মধ্যে আছে : / ? # & = যাতে ভ্যালুটি URL কাঠামো ভাঙতে না পারে। উদাহরণ: 'hello world & page=2' → 'hello%20world%20%26%20page%3D2'। encodeURI হলো একটি সম্পূর্ণ URL-এর জন্য — এটি : / ? & #-এর মতো কাঠামোগত অক্ষর অক্ষত রাখে যাতে URL কাজ করতে থাকে। নিয়ম হিসেবে, একটি লিংকে বসানো আলাদা ভ্যালুর জন্য সবসময় encodeURIComponent ব্যবহার করুন।
পার্সেন্ট-এনকোডিং কী?
পার্সেন্ট-এনকোডিং হলো URL এনকোডিংয়ের আনুষ্ঠানিক RFC 3986 নাম। প্রতিটি অনিরাপদ বাইট একটি % এবং তার পরে ঠিক দুটি বড় হাতের হেক্স অঙ্ক হিসেবে লেখা হয়। মাল্টি-বাইট UTF-8 অক্ষর একাধিক %XX সিকোয়েন্সে বিস্তৃত হয়: ইউরো চিহ্ন '€' হয় %E2%82%AC, একটি উচ্চারণচিহ্নযুক্ত 'é' হয় %C3%A9। স্পেসিফিকেশন একটি 'unreserved' অক্ষরের সেট সংজ্ঞায়িত করে (A–Z, a–z, 0–9, -, _, ., ~) যা কখনও এনকোড হয় না।
একটি URL-এ কোন অক্ষরগুলো এনকোড করা দরকার?
unreserved সেটের বাইরের যেকোনো অক্ষর (A–Z, a–z, 0–9, হাইফেন, আন্ডারস্কোর, ডট, টিল্ড) বেশিরভাগ URL প্রসঙ্গে অবশ্যই পার্সেন্ট-এনকোড করতে হবে। সবচেয়ে সাধারণগুলো: space → %20, & → %26, = → %3D, ? → %3F, # → %23, / → %2F, : → %3A, @ → %40, + → %2B, % → %25। নন-ASCII অক্ষর (উচ্চারণচিহ্ন, ইমোজি) UTF-8-এর মাধ্যমে একাধিক %XX সিকোয়েন্স হিসেবে এনকোড হয়।
কখনও একটি স্পেস %20 আবার কখনও + হয় কেন?
URL পাথে (?-এর আগে), RFC 3986 অনুযায়ী স্পেস অবশ্যই %20 হতে হবে। কোয়েরি স্ট্রিংয়ে, HTML ফর্মের ব্যবহৃত পুরোনো application/x-www-form-urlencoded ফরম্যাট ঐতিহাসিক সংক্ষিপ্ততার কারণে স্পেসকে + হিসেবে এনকোড করে। দুটোই 'স্পেস' বোঝায়, কিন্তু শুধু নিজ নিজ প্রসঙ্গে — একটি কোয়েরি ভ্যালুতে আক্ষরিক একটি + কে অবশ্যই %2B হিসেবে এনকোড করতে হবে, নয়তো তা স্পেস হিসেবে ভুল পড়া হবে। এই টুলের + as space টগলটি ডিকোডের সময় ফর্ম-এনকোডেড ইনপুট সামলায়।
URL এনকোডিংয়ে %25 কী?
%25 হলো একটি আক্ষরিক % অক্ষরের পার্সেন্ট-এনকোডেড রূপ (ASCII 37 = হেক্স 25)। আপনার যদি একটি URL-এ একটি সত্যিকারের পার্সেন্ট চিহ্ন দরকার হয় — যেমন '100%'-এর একটি সার্চ কোয়েরিতে — আপনাকে অবশ্যই এটিকে %25 হিসেবে এনকোড করতে হবে যাতে পার্সার এটিকে একটি পার্সেন্ট-এনকোডেড সিকোয়েন্সের শুরু হিসেবে না ধরে। '100%' স্ট্রিংটি একটি কোয়েরি ভ্যালু হিসেবে এনকোড হয়ে হয় '100%25'।
JavaScript-এ কীভাবে URL-এনকোড করব?
আলাদা ভ্যালুর জন্য encodeURIComponent() ব্যবহার করুন: encodeURIComponent('hello world & co.') রিটার্ন করে 'hello%20world%20%26%20co.'। decodeURIComponent() দিয়ে তা উল্টান। একটি সম্পূর্ণ URL-এর জন্য encodeURI() / decodeURI() ব্যবহার করুন — এগুলো কাঠামোগত অক্ষর বাদ দেয়। দুটোই প্রতিটি ব্রাউজার ও Node.js-এ বিল্ট-ইন, কোনো import ছাড়াই।
Python-এ কীভাবে URL-এনকোড করব?
একটি একক ভ্যালুর জন্য urllib.parse.quote() ব্যবহার করুন: from urllib.parse import quote; quote('hello world & co.') → 'hello%20world%20%26%20co.'। ডিকোড করতে: unquote('hello%20world%20%26%20co.')। একটি সম্পূর্ণ কোয়েরি স্ট্রিং dict-এর জন্য: urlencode({'q': 'hello world', 'page': '2'}) → 'q=hello+world&page=2'। quote_plus() HTML ফর্ম এনকোডিংয়ের সাথে মিলিয়ে স্পেসের জন্য + ব্যবহার করে।
URL এনকোডিংয়ের জন্য এটি CyberChef-এর সাথে কীভাবে তুলনীয়?
CyberChef হলো GCHQ-এর একটি চমৎকার বহুমুখী টুল, কিন্তু এটি জটিল ডেটা রূপান্তর পাইপলাইনের জন্য তৈরি — শুধু একটি URL স্ট্রিং এনকোড করতে এটি লোড করা মানে এর 'recipe' ইন্টারফেসে নেভিগেট করা, যা অতিরিক্ত মনে হতে পারে। এই টুলটি ফোকাসড: আপনার টেক্সট পেস্ট করুন, Encode বা Decode বেছে নিন, ফলাফল সঙ্গে সঙ্গে পান। কোনো recipe নেই, কোনো মেনু নেই। CyberChef-এ বিশেষভাবে URL এনকোডিংয়ে পৌঁছাতে বেশি ক্লিক লাগে; এই টুল সরাসরি সেটিতেই খোলে।
অনলাইনে এনকোড/ডিকোড করা কি নিরাপদ?
হ্যাঁ — এই টুলটি ১০০% লোকাল। প্রতিটি এনকোড ও ডিকোড অপারেশন আপনার ব্রাউজারে বিল্ট-ইন JavaScript ফাংশন (encodeURIComponent, decodeURIComponent, encodeURI, decodeURI) দিয়ে চলে। আপনার টেক্সট কখনও কোনো সার্ভারে পাঠানো, সংরক্ষণ বা লগ করা হয় না। পেজটি লোড হওয়ার পর আপনি অফলাইনে গেলেও এটি কাজ করতে থাকে। API কী, ক্রেডেনশিয়াল বা টোকেন এনকোড করার সময় এটি বিশেষভাবে গুরুত্বপূর্ণ।
এটি কি অফলাইনে কাজ করে?
হ্যাঁ। সব লজিক আপনার ব্রাউজারে শূন্য নেটওয়ার্ক রিকোয়েস্টে চলে। পেজটি একবার লোড হয়ে গেলে আপনি Wi-Fi বা মোবাইল ডেটা বন্ধ করতে পারেন আর এটি নিখুঁতভাবে কাজ করতে থাকে — কোনো টেক্সট আপনার ডিভাইস না ছেড়ে সংবেদনশীল API কী বা ক্রেডেনশিয়াল এনকোড করতে সুবিধাজনক।
Related tools
সব টুল দেখুনCron এক্সপ্রেশন বিল্ডার
একটি Cron সময়সূচি সহজ ভাষায় ব্যাখ্যা করুন এবং পরবর্তী রান সময় প্রিভিউ করুন।
HTML মিনিফায়ার
কমেন্ট মুছে ও হোয়াইটস্পেস সংকুচিত করে HTML কমপ্রেস করুন।
CSS মিনিফায়ার
কমেন্ট ও অপ্রয়োজনীয় হোয়াইটস্পেস সরিয়ে CSS ছোট করুন।
JSON Escape / Unescape
কাঁচা টেক্সটকে JSON-নিরাপদ স্ট্রিংয়ে escape করুন এবং আবার unescape করুন।
HTTP স্ট্যাটাস কোড
সহজ ভাষায় অর্থ সহ HTTP স্ট্যাটাস কোডের অনুসন্ধানযোগ্য রেফারেন্স।
Regex চিটশিট
regular expression টোকেন ও ফ্ল্যাগের অনুসন্ধানযোগ্য রেফারেন্স।