Percent-Encoding

Cơ chế biểu diễn các ký tự đặc biệt trong URL dưới dạng %XX. Còn gọi là mã hóa URL.

Percent-encoding (còn gọi là mã hóa URL) là cơ chế biểu diễn các ký tự không thể sử dụng trực tiếp trong URL dưới dạng ký hiệu phần trăm theo sau là giá trị thập lục phân hai chữ số (%XX). Ví dụ, khoảng trắng được mã hóa thành %20, dấu và (&) thành %26, và ký tự tiếng Nhật "あ" (UTF-8: E3 81 82) thành %E3%81%82. Được định nghĩa trong RFC 3986, nó đảm bảo URL chỉ chứa các ký tự ASCII an toàn.

URL chỉ có thể chứa một tập hợp giới hạn các ký tự ASCII không dành riêng (chữ cái, số, -._~). Các ký tự dành riêng (:/?#[]@!

Percent-encoding is a mechanism for representing characters that cannot be used directly in URLs by replacing them with % followed by two hexadecimal digits. Also known as URL encoding, it is standardized in RFC 3986. As a foundational web technology, it is essential for safely exchanging non-ASCII characters and reserved characters between browsers and servers.

The encoding mechanism is straightforward. The target character is converted to a UTF-8 byte sequence, and each byte is represented as % plus two hexadecimal digits. For example, a space becomes %20 (0x20), and the Japanese character "あ" is 3 bytes in UTF-8 (0xE3, 0x81, 0x82), resulting in %E3%81%82. RFC 3986 specifies that all characters except unreserved characters (A-Z, a-z, 0-9, -, _, ., ~) must be percent-encoded. Web development fundamentals books cover URL encoding in detail.

In practice, browsers automatically apply percent-encoding when sending search queries and form data. JavaScript provides encodeURIComponent() for encoding and decodeURIComponent() for decoding. Meanwhile, encodeURI() targets the entire URL and does not encode reserved characters like / or ?. Misusing these two functions can break URLs or introduce security vulnerabilities.

A common misconception is confusing percent-encoding with HTML entities (such as &). Percent-encoding is exclusively for URLs, while HTML entity escaping serves a different purpose with different syntax. Also note that when handling internationalized URLs, browsers display decoded URLs in the address bar, but the actual HTTP request sends the encoded URL.

A related concept is Base64 encoding, but they serve different purposes. Percent-encoding safely represents individual characters within URLs, while Base64 converts binary data into text format. Additionally, in the application/x-www-form-urlencoded format, spaces are represented as + rather than %20, illustrating context-dependent variations. HTTP protocol guides explain URL structure and encoding in detail.

From a character counting perspective, percent-encoding creates a discrepancy between the original character count and the URL byte length. A single Japanese character occupies 3 bytes in UTF-8 and expands to 9 characters (%XX%XX%XX) after percent-encoding. When considering URL length limits (approximately 2,000 characters in most browsers), it is important to estimate how long query parameters containing non-ASCII characters will become.

amp;'()*+,;=) có ý nghĩa đặc biệt trong cú pháp URL và phải được percent-encode khi sử dụng như dữ liệu. Ví dụ, trong tham số truy vấn ?q=a&b, & là dấu phân tách tham số, nhưng nếu muốn tìm kiếm chuỗi "a&b", nó phải được mã hóa thành ?q=a%26b. Bạn có thể tham khảo sách nền tảng phát triển web về xử lý URL chi tiết.

Trong JavaScript, encodeURIComponent() mã hóa tất cả ký tự đặc biệt bao gồm /?, phù hợp cho mã hóa giá trị tham số truy vấn. encodeURI() giữ nguyên các ký tự cấu trúc URL, phù hợp cho mã hóa toàn bộ URL. Trong Python, urllib.parse.quote()quote_plus() (mã hóa khoảng trắng thành +) phục vụ các mục đích tương tự. Nhầm lẫn giữa các hàm này là nguồn lỗi phổ biến.

Percent-encoding đặc biệt quan trọng cho URL quốc tế hóa. Tên miền quốc tế hóa (IDN) sử dụng mã hóa Punycode riêng biệt, nhưng các thành phần đường dẫn và truy vấn sử dụng percent-encoding. Ký tự tiếng Nhật, tiếng Trung và tiếng Hàn trong URL được chuyển đổi thành byte UTF-8 rồi percent-encode từng byte. Trình duyệt hiện đại hiển thị URL đã giải mã trong thanh địa chỉ cho khả năng đọc, nhưng HTTP request thực tế chứa dạng đã mã hóa.

Một quan niệm sai lầm phổ biến là percent-encoding và mã hóa HTML entity (như &) là giống nhau. Chúng phục vụ các mục đích khác nhau: percent-encoding dành cho URL, trong khi HTML entity dành cho nội dung HTML. Ngoài ra, mã hóa kép (mã hóa chuỗi đã mã hóa) là lỗi thường gặp, dẫn đến URL như %2520 (trong đó %25 là percent-encode của %). Luôn giải mã trước khi mã hóa lại để tránh vấn đề này. Bạn có thể tham khảo sách mã hóa URL và bảo mật web để tìm hiểu thêm.

Từ góc độ đếm ký tự, percent-encoding tăng đáng kể độ dài chuỗi. Một ký tự tiếng Nhật (3 byte trong UTF-8) trở thành 9 ký tự khi percent-encode (ví dụ: %E3%81%82). Điều này ảnh hưởng đến giới hạn độ dài URL (thường 2048 ký tự cho hầu hết trình duyệt). Sử dụng công cụ đếm ký tự để kiểm tra cả độ dài trước và sau mã hóa giúp đảm bảo URL không vượt quá giới hạn.