Mã hóa & giải mã URL
Chuyển văn bản thành dạng an toàn để đưa vào URL, hoặc đổi các chuỗi kiểu %20 trở lại thành ký tự dễ đọc. Công cụ dùng chính encodeURIComponent, encodeURI và decodeURIComponent của trình duyệt, liệt kê tham số truy vấn trong một bảng và không gửi gì lên máy chủ.
0 ký tự · 0 từ · 0 dòng
0 ký tự · 0 từ · 0 dòng
Chạy hoàn toàn trong tab trình duyệt này. Văn bản của bạn không bao giờ được tải lên hay lưu trữ.
Mỗi hàm thoát những ký tự nào
Được tính bằng chính các hàm của trình duyệt. encodeURIComponent giữ nguyên chữ cái, chữ số và các dấu sau: ! ' ( ) * - . _ ~
| Ký tự | encodeURIComponent | encodeURI |
|---|---|---|
(dấu cách) | %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 |
Mã hóa phần trăm và các ký tự dành riêng theo RFC 3986
Một URL chỉ được chứa một tập ký tự ASCII giới hạn. RFC 3986, đặc tả cú pháp URI năm 2005, chia chúng thành hai nhóm. Các ký tự không dành riêng (unreserved) gồm A–Z, a–z, 0–9 và bốn dấu - . _ ~, không bao giờ cần mã hóa. Các ký tự dành riêng (reserved) có nhiệm vụ riêng: các dấu phân cách chung : / ? # [ ] @ ngăn cách giao thức, máy chủ, đường dẫn, truy vấn và đoạn (fragment), còn các dấu phân cách phụ ! $ & ' ( ) * + , ; = ngăn cách các mục bên trong chúng, như & và = trong chuỗi truy vấn. Mọi ký tự còn lại, cũng như ký tự dành riêng được dùng như dữ liệu thông thường, đều phải được mã hóa phần trăm.
Mã hóa phần trăm viết một byte thành % kèm hai chữ số thập lục phân. Văn bản trước tiên được chuyển sang UTF-8, nên dấu cách thành %20, chữ é (hai byte) thành %C3%A9 và một emoji thành bốn nhóm %XX. Vì vậy, khi tìm kiếm "café & bar", liên kết sẽ có dạng caf%C3%A9%20%26%20bar: dấu & được mã hóa để máy chủ không hiểu nhầm là phần bắt đầu của một tham số mới.
encodeURIComponent, encodeURI và giải mã
encodeURIComponent là lựa chọn phù hợp cho một phần riêng lẻ, chẳng hạn giá trị truy vấn, một đoạn đường dẫn hoặc URL chuyển hướng truyền làm tham số. Hàm này mã hóa mọi ký tự trừ các ký tự không dành riêng và ! ' ( ) *, vốn được JavaScript giữ nguyên vì lý do lịch sử. encodeURI (whole URL) giả định đầu vào đã là một địa chỉ hoàn chỉnh và giữ nguyên các ký tự dành riêng, nên với https://example.com/a b?q=1 chỉ dấu cách được mã hóa. Dùng encodeURI cho giá trị tham số là lỗi kinh điển: dấu & hoặc # trong giá trị vẫn còn nguyên và làm hỏng URL.
Decode đảo ngược cả hai hàm trên. Biểu mẫu HTML gửi bằng GET dùng định dạng application/x-www-form-urlencoded cũ hơn, trong đó dấu cách được viết là + thay vì %20; hãy giữ nguyên tùy chọn Treat + as a space được chọn cho các trường hợp đó, và bỏ chọn khi dấu cộng có ý nghĩa thực sự, ví dụ trong số điện thoại. Nếu đầu vào có dấu % không theo sau bởi hai chữ số thập lục phân, hoặc có byte không phải UTF-8 hợp lệ, việc giải mã sẽ báo lỗi rõ ràng thay vì đoán. Khi văn bản chứa chuỗi truy vấn, các tham số của nó được giải mã và hiển thị trong bảng bên dưới công cụ. Với dữ liệu nhị phân trong URL, Base64url là giải pháp thay thế thường dùng.
Câu hỏi thường gặp
- Dấu cách trong URL nên là %20 hay dấu cộng?
- Trong đường dẫn và theo RFC 3986, dấu cách là %20. Dạng + chỉ có nghĩa là dấu cách bên trong chuỗi truy vấn được mã hóa theo cách biểu mẫu HTML mã hóa, nên %20 là lựa chọn an toàn ở mọi nơi.
- Vì sao URL của tôi lại xuất hiện %2520?
- Nó đã bị mã hóa hai lần. Lần đầu biến dấu cách thành %20, lần hai mã hóa chính dấu % thành %25. Hãy giải mã một lần để bỏ lớp thừa, và chỉ mã hóa giá trị tại một điểm duy nhất trong mã của bạn.
- Những ký tự nào không bao giờ cần mã hóa phần trăm?
- Tập ký tự không dành riêng của RFC 3986: các chữ cái từ A đến Z cả hoa lẫn thường, các chữ số từ 0 đến 9, cùng dấu gạch nối, dấu chấm, dấu gạch dưới và dấu ngã.
- URL có thể chứa chữ có dấu hoặc chữ không phải tiếng Anh mà không cần mã hóa không?
- Trình duyệt hiển thị chúng, nhưng khi truyền đi, mọi ký tự không phải ASCII trong đường dẫn hoặc truy vấn đều được gửi dưới dạng UTF-8 mã hóa phần trăm. Tên miền dùng một hệ thống riêng là Punycode, chuyển chúng thành các nhãn xn--.
- Vì sao khi giải mã lại báo chuỗi không hợp lệ?
- Văn bản có dấu % không theo sau bởi hai chữ số thập lục phân, chẳng hạn "100%" theo nghĩa đen, hoặc các byte giải mã ra UTF-8 không hợp lệ. Hãy mã hóa các dấu % lẻ thành %25 trước khi giải mã.