Mã hóa URL (URL encoding) là gì?
Địa chỉ web chỉ được phép chứa một tập ký tự rất hẹp: chữ cái không dấu, chữ số và vài dấu đặc biệt như gạch ngang, gạch dưới, dấu chấm. Mọi ký tự nằm ngoài tập đó — khoảng trắng, chữ tiếng Việt có dấu, dấu tiếng Nhật, biểu tượng cảm xúc — đều phải được viết lại dưới dạng phần trăm (percent-encoding). Quy tắc rất đơn giản: ký tự được chuyển sang các byte UTF-8, mỗi byte được ghi thành dấu phần trăm cộng hai chữ số hex. Khoảng trắng thành %20, chữ "à" thành %C3%A0, chữ "ư" thành %C6%B0.
Công cụ này làm cả hai chiều ngay trên trình duyệt của bạn. Chiều mã hóa biến văn bản hoặc đường dẫn có dấu thành chuỗi %xx an toàn để dán vào thanh địa chỉ, gửi qua tin nhắn hay đặt trong thẻ liên kết. Chiều giải mã đưa chuỗi %xx khó đọc trở lại thành tiếng Việt bình thường, rất tiện khi bạn nhận một link dài từ Google, Facebook hay hệ thống quản trị và muốn biết nó thực sự chứa gì.
Khi nào bạn cần mã hóa URL?
- Đường dẫn có dấu tiếng Việt: bài viết đặt slug tiếng Việt, tên file tải lên có dấu, thư mục chứa khoảng trắng.
- Tham số tìm kiếm: khi từ khóa người dùng nhập chứa dấu cách, dấu &, dấu = hoặc dấu #, nếu không mã hóa thì máy chủ sẽ hiểu sai ranh giới các tham số.
- Gắn tracking UTM cho chiến dịch quảng cáo: tên chiến dịch có dấu hoặc có khoảng trắng phải được mã hóa mới đo được chính xác.
- Gọi API, viết webhook: giá trị đưa vào query string bắt buộc phải mã hóa, nhất là khi nó chính là một URL khác (link redirect, callback).
- Đọc ngược một link lạ: giải mã để nhìn rõ tham số ẩn bên trong trước khi bấm vào.
encodeURI và encodeURIComponent khác nhau ra sao?
Đây là điểm hay nhầm nhất, và chọn sai sẽ làm hỏng link. Hai hàm khác nhau ở chỗ chúng có đụng tới các ký tự "cấu trúc" của URL hay không.
encodeURIComponent — mã hóa toàn bộ. Hàm này giữ nguyên duy nhất chữ, số và một nhóm nhỏ ký tự an toàn; mọi thứ còn lại, kể cả dấu hai chấm, gạch chéo, dấu hỏi, dấu &, dấu = và dấu #, đều bị đổi thành %xx. Hãy dùng nó khi bạn mã hóa một mảnh của URL: giá trị của một tham số, một đoạn đường dẫn, một từ khóa.
encodeURI — chỉ mã hóa phần cần thiết. Hàm này cố tình bỏ qua các ký tự dựng nên cấu trúc địa chỉ, nên sau khi chạy xong bạn vẫn còn một URL bấm được. Hãy dùng nó khi bạn có cả một đường dẫn hoàn chỉnh và chỉ muốn xử lý khoảng trắng cùng chữ có dấu.
Ví dụ với chuỗi https://tienichso.com.vn/tim kiem?q=lãi suất:
- encodeURI cho ra
https://tienichso.com.vn/tim%20kiem?q=l%C3%A3i%20su%E1%BA%A5t— vẫn là một link mở được. - encodeURIComponent cho ra
https%3A%2F%2Ftienichso.com.vn%2Ftim%20kiem%3Fq%3Dl%C3%A3i%20su%E1%BA%A5t— không còn là link, nhưng chính là dạng bạn cần khi muốn nhét cả đường dẫn này vào tham số của một URL khác, ví dụ?redirect=....
Chiều giải mã cũng có cặp tương ứng: decodeURIComponent trả lại mọi thứ, còn decodeURI cố ý không đụng tới các chuỗi như %23, %26, %3F để không phá vỡ cấu trúc URL.
Vì sao có chuỗi giải mã bị báo lỗi?
Một chuỗi hợp lệ yêu cầu mỗi dấu phần trăm phải đi kèm đúng hai chữ số hex, và các byte ghép lại phải tạo thành ký tự UTF-8 hợp lệ. Nếu link bị cắt cụt khi sao chép, bị mã hóa hai lần rồi giải mã một lần, hoặc trong nội dung có sẵn dấu % dùng theo nghĩa phần trăm, kết quả sẽ sai. Khi đó công cụ chỉ rõ vị trí dấu % gây lỗi để bạn sửa nhanh thay vì chỉ báo chung chung.
Ngoài ra còn một chi tiết nhỏ hay gây khó chịu: trong dữ liệu biểu mẫu gửi theo chuẩn application/x-www-form-urlencoded, khoảng trắng được ghi thành dấu cộng chứ không phải %20. Vì vậy công cụ có tùy chọn "coi dấu + là khoảng trắng", bạn chỉ bật khi chuỗi đến từ biểu mẫu.
Bảng tham số giúp gì cho bạn?
Khi chuỗi bạn nhập có dấu hỏi, công cụ tự tách phần query thành bảng key – value và giải mã sẵn từng giá trị. Một link quảng cáo dài hàng trăm ký tự sẽ hiện ra thành vài dòng dễ đọc: từ khóa là gì, chiến dịch nào, trang bao nhiêu, link chuyển hướng đi đâu. Đây là cách nhanh nhất để kiểm tra xem tham số UTM đã gắn đúng chưa, hoặc để hiểu một đường dẫn lạ trước khi mở.
Toàn bộ xử lý chạy bằng JavaScript ngay trên máy bạn, không có dữ liệu nào được gửi lên máy chủ. Dù vậy, hãy nhớ rằng mã hóa URL chỉ là cách biểu diễn ký tự, hoàn toàn không phải mã hóa bảo mật — bất kỳ ai cũng giải mã ngược lại được, nên đừng bao giờ đặt mật khẩu hay token nhạy cảm trên đường dẫn.
Các công cụ hay dùng cùng
Base64 nằm cùng nhóm hiểu nhầm: cũng là phép biểu diễn, cũng đảo ngược được, cũng thường bị tưởng nhầm là mã hóa. Trong thực tế bạn hay gặp cả hai chồng lên nhau — một tham số trên URL chứa chuỗi Base64, phải giải hai lớp mới ra dữ liệu gốc.
Khi lớp trong cùng là JSON, công cụ format JSON bung ra dạng dễ đọc và chỉ đúng vị trí lỗi cú pháp. Muốn tạo link chia sẻ có tiếng Việt cho khách quét bằng điện thoại, hãy encode đường dẫn ở đây rồi đưa sang công cụ tạo mã QR.
Khi cần đặt tên tệp hoặc slug URL không dấu thay vì mã hóa phần trăm khó đọc, bỏ dấu tiếng Việt cho ra đường dẫn gọn và thân thiện với SEO hơn nhiều.