Mã hóa URL
Mã hóa percent-encoding cho chuỗi ký tự an toàn khi đặt vào URL.
Đường dẫn URL chỉ chấp nhận một tập hợp ký tự giới hạn theo quy chuẩn. Tất cả những thành phần còn lại — từ khoảng trắng, dấu và, dấu chấm hỏi, chữ cái có dấu tiếng Việt đến các ký tự phi Latinh — đều bắt buộc phải mã hóa percent-encoding, nếu không liên kết sẽ bị hỏng và rất khó tìm ra nguyên nhân.
Rủi ro khi ký tự dành riêng xuất hiện trong URL
Nhiều ký tự mang ý nghĩa phân tách cấu trúc trong một liên kết web. Chẳng hạn, ký hiệu ? mở đầu chuỗi truy vấn, & ngăn cách giữa các tham số, = gán giá trị cho khóa, còn # đánh dấu điểm neo.
Nếu bạn đưa trực tiếp một dấu và vào nội dung giá trị — ví dụ tên công ty dạng “Smith & Sons” — máy chủ xử lý sẽ hiểu đó là điểm khởi đầu của tham số kế tiếp. Giá trị bạn gửi bị cắt ngắn thành “Smith” và phát sinh một tham số rỗng ngoài ý muốn. Việc chuyển đổi ký tự đó thành %26 báo cho hệ thống hiểu đây là dữ liệu văn bản thuần túy chứ không phải ký hiệu điều hướng.
Các bước thực hiện mã hóa URL chuẩn xác
- Dán đoạn văn bản hoặc tham số bạn muốn chèn vào đường dẫn.
- Nhấn nút mã hóa trên giao diện để gửi dữ liệu xử lý.
- Sao chép kết quả đã xử lý vào chuỗi truy vấn, đoạn đường dẫn hoặc liên kết chuyển hướng.
- Thực hiện mã hóa riêng rẽ từng giá trị tham số thay vì đưa toàn bộ một địa chỉ web hoàn chỉnh vào công cụ.
- Kiểm tra lại nội dung giải mã bằng công cụ tương ứng để đối chiếu độ chính xác.
Bảng ký tự mã hóa URL phổ biến
| Ký tự | Dạng mã hóa | Ý nghĩa kỹ thuật |
|---|---|---|
| khoảng trắng | %20 hoặc + | Gây ngắt quãng đường dẫn trong phần lớn trường hợp |
| & | %26 | Tránh bị nhận diện nhầm thành ký tự ngăn cách tham số |
| ? | %3F | Tránh bị hiểu là điểm bắt đầu của chuỗi truy vấn |
| = | %3D | Tránh làm xáo trộn việc phân tách cặp khóa và giá trị |
| # | %23 | Tránh việc phần nội dung phía sau bị coi là điểm neo |
| / | %2F | Tránh bị phân tích nhầm thành dấu phân tách thư mục đường dẫn |
| + | %2B | Ngăn việc hệ thống tự động giải mã ngược lại thành khoảng trắng |
Quy tắc mã hóa từng phần tử trong URL
Sai lầm thường gặp nhất là đưa cả một địa chỉ web nguyên vẹn vào bộ mã hóa. Thao tác đó biến đổi luôn cả chuỗi :// cùng những dấu phân cách hợp lệ thành chuỗi phần trăm, khiến máy chủ không còn phân tích được cấu trúc trang đích.
Cách làm đúng là mã hóa từng biến số riêng lẻ rồi mới ghép nối lại vào khung URL. Trong lập trình JavaScript, điều này tương đương với việc dùng lệnh encodeURIComponent() cho giá trị tham số, và chỉ dùng lệnh encodeURI() khi thật sự cần dọn dẹp một URL đầy đủ.
Thắc mắc thường gặp về mã hóa URL
Mã hóa percent-encoding hoạt động theo nguyên lý nào?
Đây là cơ chế biểu diễn một ký tự dưới dạng dấu phần trăm đi liền với giá trị byte thập lục phân tương ứng. Ký tự khoảng trắng chuyển thành %20 vì 20 chính là mã thập lục phân của nó trong bảng mã ASCII.
Vì sao khoảng trắng lúc biến thành %20 lúc lại thành dấu cộng?
Các biểu mẫu HTML từ trước đến nay thường chuyển khoảng trắng thành + khi gửi dữ liệu qua chuỗi truy vấn. Cả hai cách biểu diễn đều xuất hiện trong thực tế, nhưng %20 dùng được ở mọi vị trí, còn + chỉ hợp lệ trong chuỗi truy vấn và không dùng được trên đường dẫn thư mục.
Nên dùng encodeURIComponent hay encodeURI khi viết mã?
Bạn nên dùng encodeURIComponent cho từng giá trị tham số cụ thể vì hàm này mã hóa cả các ký tự dành riêng. Chỉ dùng encodeURI khi bạn sở hữu một URL hoàn chỉnh và chỉ muốn loại bỏ ký tự không hợp lệ như khoảng trắng.
Các ký tự có dấu hoặc phi Latinh được xử lý ra sao?
Chúng được chuyển đổi thành chuỗi byte UTF-8 trước, sau đó mỗi byte tiếp tục được mã hóa percent-encoding. Do đó, một ký tự có dấu thường tạo ra hai cụm ký hiệu phần trăm liên tiếp.
Mã hóa hai lần liên tiếp có gây lỗi dữ liệu không?
Có, việc mã hóa lặp lại rất dễ tạo ra lỗi phần mềm. Quá trình mã hóa kép biến %20 thành %2520, khiến máy chủ sau một lần giải mã chỉ thu được chuỗi văn bản %20 thay vì khoảng trắng ban đầu.