Mã hóa / giải mã URL
Mã hóa phần trăm hoặc giải mã thành phần URL và chuỗi truy vấn
Về công cụ này
Những ký tự như dấu cách, dấu và, hay chữ cái ngoài ASCII không thể xuất hiện nguyên dạng trong URL, nên chúng được mã hóa phần trăm: dấu cách thành %20, còn 你 thành %E4%BD%A0. Công cụ này mã hóa văn bản để đưa an toàn vào URL và giải mã các chuỗi thoát phần trăm trở lại thành chữ đọc được, kể cả quy ước dùng dấu + thay cho dấu cách trong chuỗi truy vấn.
Có hai chế độ mã hóa vì bản thân JavaScript cũng có hai: chế độ thành phần (encodeURIComponent) thoát mọi ký tự có thể cắt ngang URL, đúng thứ bạn cần cho một giá trị đơn lẻ trong chuỗi truy vấn; chế độ URI đầy đủ (encodeURI) giữ nguyên các ký tự cấu trúc như /, ? và &, dành cho khi bạn mã hóa nguyên một URL mà nó vẫn phải bấm vào được.
Việc giải mã rất nghiêm với các chuỗi % hỏng — một dấu % đứng lẻ hay %ZZ sẽ bị báo lỗi thay vì lặng lẽ cho qua, đúng như cách trình duyệt và máy chủ sẽ đối xử với nó.
Câu hỏi thường gặp
- Khi nào dùng chế độ thành phần, khi nào dùng chế độ URI đầy đủ?
- Mã hóa một giá trị nằm bên trong URL (từ khóa tìm kiếm, địa chỉ chuyển hướng, email trong tham số) → chế độ thành phần, để dấu & và = bên trong giá trị không phá vỡ chuỗi truy vấn. Mã hóa cả một URL hoàn chỉnh để hiển thị hoặc gửi đi → chế độ URI đầy đủ, để cấu trúc URL còn nguyên.
- Vì sao đôi khi dấu + lại có nghĩa là dấu cách?
- Định dạng application/x-www-form-urlencoded — dùng khi gửi biểu mẫu HTML và trong chuỗi truy vấn — theo truyền thống mã hóa dấu cách thành +. Còn trong phần đường dẫn của URL, + chỉ là dấu cộng. Bộ giải mã ở đây coi + là dấu cách, theo đúng ngữ nghĩa chuỗi truy vấn; riêng %20 thì lúc nào cũng đúng ở mọi nơi.
- Vì sao chuỗi của tôi bị mã hóa hai lần (%2520)?
- %25 chính là mã của ký tự %, nên %2520 nghĩa là đoạn %20 đã bị mã hóa thêm một lần nữa. Chuyện này xảy ra khi hai tầng trong hệ thống cùng mã hóa. Hãy giải mã hai lần ở đây để bóc ra, rồi sửa cái tầng lẽ ra không nên mã hóa.
- Ký tự Unicode có được xử lý đúng không?
- Có — theo chuẩn URL của WHATWG, văn bản được mã hóa sang UTF-8 trước rồi từng byte mới được thoát phần trăm. Đó là lý do một ký tự CJK biến thành ba nhóm %XX.