Menu

Mã hóa / Giải mã URL

Mã hóa và giải mã thành phần URL an toàn.

Tác giả Nethanel Bar, Co-founder & CEO

Cập nhật lần cuối

Sẵn sàng học code thật sự?

Coddy dạy bạn bằng cách viết code thật ngay trên trình duyệt: bài học tương tác, phản hồi tức thì và AI hỗ trợ khi bạn bị kẹt.

URL encoder là gì?

URL encoder (còn gọi là công cụ mã hóa phần trăm hay URI encoder) thay các ký tự dành riêng hoặc không an toàn trong URL bằng % kèm hai chữ số hex. Lập trình viên dùng nó khi tạo query string, escape một đoạn path, chia sẻ URL có dấu cách hoặc ký tự ngoài ASCII, và khi gỡ lỗi redirect.

URL chỉ được chứa một tập nhỏ ký tự ASCII. Mọi thứ nằm ngoài tập đó, như dấu cách, chữ có dấu, emoji, hay các ký hiệu dành riêng như ?, #, &, = khi chúng là dữ liệu, đều phải được mã hóa phần trăm để đi nguyên vẹn từ trình duyệt đến máy chủ.

JavaScript có hai hàm mã hóa: encodeURI (giữ nguyên cấu trúc URL: /, ?, #, &) và encodeURIComponent (mã hóa mọi ký tự dành riêng). Dùng encodeURIComponent cho các *giá trị* bạn đưa vào query string, và encodeURI cho *cả URL* mà bạn vẫn muốn hoạt động bình thường.

Bạn học được gì khi mã hóa URL

  • Mã hóa phần trăm thay một byte bằng % cộng hai chữ số hex. Ví dụ, dấu cách thành %20.
  • Các ký tự dành riêng (: / ? # & = +) có ý nghĩa trong cấu trúc URL. Khi dùng chúng làm dữ liệu chứ không phải dấu phân tách, bạn phải mã hóa chúng.
  • Văn bản ngoài ASCII (chữ có dấu tiếng Việt, emoji, chữ Kirin, chữ CJK) trước tiên được chuyển thành các byte UTF-8, rồi từng byte được mã hóa phần trăm.
  • encodeURI giữ nguyên cấu trúc URL; encodeURIComponent mã hóa mọi ký tự dành riêng. Hãy dùng đúng hàm cho đúng vị trí.

Cách encode và decode URL từng bước

  1. Chọn chiều chuyển đổi

    Chọn Encode nếu bạn có văn bản gốc và muốn nó an toàn trong URL. Chọn Decode nếu bạn có chuỗi đã mã hóa bằng % và muốn lấy lại văn bản gốc.

  2. Chọn chế độ mã hóa

    Chọn encodeURIComponent (mã hóa mọi ký tự dành riêng) cho giá trị trong query string; chọn encodeURI (giữ cấu trúc) cho cả URL.

  3. Dán đầu vào

    Dán văn bản gốc hoặc URL đã mã hóa. Bạn có thể dán nhiều dòng để decode cùng lúc.

  4. Sao chép kết quả

    Sao chép giá trị đã encode hoặc decode. Việc chuyển đổi chạy ngay trong trình duyệt, nên dữ liệu bí mật trong URL không rời khỏi máy của bạn.

Bảng tra nhanh các ký tự URL thường gặp

Những ký tự bạn hay thấy bị mã hóa nhất, kèm dạng mã hóa phần trăm của chúng. Ý nghĩa của các ký tự dành riêng lấy từ RFC 3986.

Ký tựĐã mã hóaLý do
dấu cách%20URL không được chứa dấu cách
!%21Một số máy chủ dành riêng ký tự này
#%23Đánh dấu đầu fragment
$%24Ký tự dành riêng
&%26Phân tách các tham số query
+%2BCó nghĩa là dấu cách trong body dạng form
/%2FDấu phân tách path
:%3APhân tách scheme và host
=%3DPhân tách khóa và giá trị trong query string
?%3FĐánh dấu đầu query string
@%40Phân tách userinfo và host
byte UTF-8%C3%A9Mỗi byte ngoài ASCII đều được mã hóa

Ví dụ URL encode để thử

Mã hóa một truy vấn tìm kiếm

Gốc

hello world & more

Đã mã hóa

hello%20world%20%26%20more

Dấu cách thành %20, còn & thành %26 để không bị nhầm là dấu phân tách tham số query.

Mã hóa ký tự ngoài ASCII

Gốc

café

Đã mã hóa

caf%C3%A9

é là chuỗi byte UTF-8 0xC3 0xA9, nên dạng mã hóa có *hai* nhóm %XX cho một ký tự đó.

encodeURI và encodeURIComponent

Gốc

https://example.com/path?q=hello world

encodeURI

https://example.com/path?q=hello%20world

encodeURIComponent

https%3A%2F%2Fexample.com%2Fpath%3Fq%3Dhello%20world

encodeURI giữ nguyên cấu trúc URL (dấu gạch chéo, ?, =). encodeURIComponent mã hóa mọi ký tự dành riêng: dùng nó cho các giá trị bạn đặt trong query string, không bao giờ cho cả URL.

Lỗi thường gặp khi mã hóa URL

  • Dùng encodeURI cho giá trị trong query string. & và = không bị mã hóa và làm hỏng việc đọc tham số.
  • Mã hóa một URL hai lần. Thấy %2520 thay vì %20 là dấu hiệu kinh điển của bug mã hóa hai lần.
  • Quên rằng + nghĩa là dấu cách trong body application/x-www-form-urlencoded, nhưng lại là chính ký tự + trong path hoặc query của URL.
  • Ghép thẳng đầu vào thô của người dùng vào URL bằng nội suy chuỗi. Luôn mã hóa giá trị trước.
  • Nghĩ rằng decodeURIComponent nhận mọi chuỗi. Hàm này ném lỗi khi gặp ký tự % đứng một mình mà không có hai chữ số hex theo sau.

Câu hỏi thường gặp về URL encode

URL encode là gì?
URL encode (còn gọi là mã hóa phần trăm) là cách biểu diễn những ký tự có ý nghĩa đặc biệt trong URL, hoặc không an toàn khi truyền đi, bằng cách thay chúng bằng % kèm hai chữ số hex.
encodeURI và encodeURIComponent khác nhau thế nào?
encodeURI giữ nguyên các ký tự cấu trúc URL (/, ?, #, &, =, +). encodeURIComponent mã hóa tất cả chúng, đúng thứ bạn cần cho từng *giá trị* riêng lẻ đặt trong URL: giá trị tham số query, đoạn path, fragment. Xem tài liệu MDN về encodeURI và encodeURIComponent.
Tại sao dấu cách lại thành %20?
URL không được chứa dấu cách, nên dấu cách được thay bằng %20, tức dạng mã hóa phần trăm của ký tự dấu cách ASCII (0x20 trong hệ hex).
Khi nào tôi cần URL encode?

Mã hóa mọi giá trị do người dùng nhập hoặc giá trị động trước khi đưa vào URL: giá trị query string, đoạn path, đích redirect, tham số OAuth. Đừng bao giờ tin rằng đầu vào thô đã an toàn cho URL.

URL encode có đảo ngược được không?
Có, đó chính là URL decode. decodeURI, decodeURIComponent hoặc bất kỳ URL decoder nào cũng chuyển dạng mã hóa phần trăm về lại ký tự gốc.

Tìm hiểu thêm

Công cụ lập trình khác

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu