Mã hóa & Giải mã URL
Dán văn bản hoặc URL → Mã hóa hoặc Giải mã → Sao chép kết quả. Hỗ trợ encodeURI, encodeURIComponent, RFC 3986. Miễn phí, bảo mật.
Các ký tự phổ biến và dạng mã hóa URL tương ứng
Cách mã hóa/giải mã URL trong các ngôn ngữ phổ biến
Nhấp để tải ví dụ vào ô nhập
Mã hóa URL là gì?
Mã hóa URL (URL encoding), còn gọi là mã hóa phần trăm (percent-encoding), là cơ chế chuyển đổi các ký tự đặc biệt trong URL thành dạng an toàn để truyền tải qua giao thức HTTP. Mỗi ký tự không an toàn được thay thế bằng dấu % theo sau là hai chữ số thập lục phân tương ứng với giá trị byte UTF-8 của ký tự đó.
Theo tiêu chuẩn RFC 3986, chỉ có các ký tự không dành riêng (unreserved characters) được phép xuất hiện nguyên dạng trong URL: chữ cái A-Z a-z, chữ số 0-9, và bốn ký tự đặc biệt - _ . ~. Tất cả các ký tự khác — bao gồm dấu cách, dấu &, dấu =, ký tự Unicode như tiếng Việt — đều phải được mã hóa phần trăm khi sử dụng trong thành phần URL.
Ví dụ, chuỗi xin chào thế giới được mã hóa thành xin%20ch%C3%A0o%20th%E1%BA%BF%20gi%E1%BB%9Bi. Mỗi ký tự Unicode được chuyển đổi thành byte UTF-8, sau đó mỗi byte được biểu diễn dưới dạng %XX.
Cách mã hóa phần trăm hoạt động
Quy trình mã hóa phần trăm gồm các bước sau:
- Xác định ký tự cần mã hóa: Kiểm tra xem ký tự có thuộc tập unreserved hay không. Nếu không, cần mã hóa.
- Chuyển đổi sang byte UTF-8: Ký tự ASCII dùng 1 byte, ký tự tiếng Việt dùng 2-3 byte, emoji dùng 4 byte.
- Biểu diễn mỗi byte: Mỗi byte được viết thành
%+ 2 chữ số hex viết hoa. Ví dụ: byte 0xC3 →%C3.
Dấu cách là trường hợp đặc biệt: trong query string (application/x-www-form-urlencoded), dấu cách thường được mã hóa thành +. Trong các thành phần URL khác (path, fragment), dấu cách phải là %20. Đây là lý do tại sao encodeURIComponent dùng %20 còn URLSearchParams dùng +.
encodeURI so với encodeURIComponent
JavaScript cung cấp hai hàm mã hóa URL tích hợp sẵn, mỗi hàm phục vụ mục đích khác nhau:
| Hàm | Không mã hóa | Khi nào dùng |
|---|---|---|
encodeURI() | : / ? # [ ] @ ! $ & ' ( ) * + , ; = - _ . ~ | Mã hóa toàn bộ URL (giữ nguyên cấu trúc URL) |
encodeURIComponent() | - _ . ~ ! ' ( ) * | Mã hóa giá trị tham số riêng lẻ |
| RFC 3986 | - _ . ~ | Mã hóa nghiêm ngặt nhất, tuân thủ chuẩn RFC 3986 |
Quy tắc chung: Dùng encodeURIComponent() cho giá trị tham số truy vấn, dùng encodeURI() cho toàn bộ URL. Sai lầm phổ biến nhất là dùng encodeURI() cho giá trị tham số — điều này không mã hóa & và =, khiến chuỗi bị phân tích sai.
Lỗi thường gặp và cạm bẫy
- Mã hóa kép (double encoding): Mã hóa chuỗi đã được mã hóa sẽ tạo ra
%2520thay vì%20. Luôn kiểm tra xem dữ liệu đã được mã hóa chưa trước khi xử lý. - Nhầm lẫn + và %20: Trong query string,
+là dấu cách hợp lệ. Nhưng trong path URL,+là ký tự+thực sự. Khi di chuyển dữ liệu giữa path và query, cần chuyển đổi đúng cách. - Quên mã hóa dấu #: Dấu
#bắt đầu fragment trong URL. Nếu giá trị tham số chứa#mà không được mã hóa, phần sau#sẽ bị mất vì trình duyệt coi đó là anchor. - Dùng sai hàm cho path vs query:
encodeURIComponentmã hóa dấu/, không phù hợp cho path. DùngencodeURIhoặc mã hóa từng segment riêng. - Không xử lý Unicode: Một số server cũ không hỗ trợ UTF-8 trong URL. Luôn đảm bảo server chấp nhận UTF-8 trước khi gửi ký tự Unicode trong URL.
Sử dụng mã hóa URL trong code
Trong phát triển web hiện đại, mã hóa URL xuất hiện ở khắp nơi: xây dựng query string cho AJAX request, tạo redirect URL, xử lý form data, và tạo canonical URL cho SEO. API URLSearchParams trong JavaScript xử lý tự động việc mã hóa và giải mã tham số truy vấn, giúp tránh lỗi mã hóa thủ công.
Trong Python, module urllib.parse cung cấp quote(), unquote(), và urlencode(). Trong PHP, urlencode() dùng + cho dấu cách (phù hợp query string), trong khi rawurlencode() dùng %20 (phù hợp path). Hiểu rõ sự khác biệt này giúp tránh bug khó phát hiện khi làm việc với REST API hoặc webhook.
Xem thẻ Code Snippets ở trên để lấy đoạn code mẫu sẵn dùng cho JavaScript, Python, PHP và cURL cho cả mã hóa và giải mã.
Giới thiệu về Developer Tools
Công cụ developer tự động hóa các phần lặp đi lặp lại của công việc phần mềm: format JSON, encode/decode Base64, decode JWT để xác minh claim của token, tạo UUID, format XML, diff cấu hình. Đây không phải tác vụ hào nhoáng, nhưng là các điểm nghẽn ngốn 10-15 phút nhiều lần mỗi ngày — cộng lại hàng giờ mỗi tuần. Chạy chúng trên tab trình duyệt sạch sẽ hơn vật lộn với phụ thuộc CLI hay extension IDE có thể gửi dữ liệu riêng tư của bạn cho bên thứ ba.
Vì sao nó quan trọng
Công cụ developer client-side nhanh về cơ bản quan trọng vì chúng được dùng với dữ liệu nhạy cảm. JWT token chứa danh tính người dùng. Payload Base64 có thể encode API key. JSON dump bao gồm bản ghi khách hàng. Nếu một 'công cụ developer' gửi input của bạn lên server để xử lý, bạn vừa rò rỉ production secret. Công cụ dev của ZestLab chạy 100% client-side không có network call nào sau khi load page — những gì bạn paste vẫn ở trong trình duyệt.
Riêng tư và an toàn
Tất cả công cụ developer ở đây chạy trong trình duyệt bằng JavaScript thuần. Không có 'decode server' hay 'format API' — JWT, JSON, payload encode của bạn được parse bởi code chạy trên laptop của bạn. Tự xác minh bằng DevTools trình duyệt → Network tab: bạn sẽ thấy không có request nào khi dùng bất kỳ công cụ nào. Đó là tiêu chuẩn chúng tôi giữ vì công cụ dev xử lý secret.
Thực hành tốt
- Không bao giờ paste JWT hay API token production vào BẤT KỲ công cụ online nào mà không xác minh chạy client-side (check tab Network)
- Dùng chế độ ẩn danh trình duyệt để decode một lần các payload nhạy cảm
- Bookmark công cụ bạn dùng hàng ngày — URL công cụ ZestLab ổn định, không cần tài khoản
- Khi format JSON có secret để team review, redact credential trước khi share output