Bộ mã hóa URL
Chuyển đổi văn bản sang định dạng an toàn cho URL bằng cách mã hóa các ký tự đặc biệt.
Nhập văn bản để mã hóa:
Cách sử dụng URL Encoder / Decoder
- 1
Nhập văn bản hoặc URL của bạn
Dán văn bản bạn muốn mã hóa hoặc chuỗi đã được URL-encode bạn muốn giải mã vào ô nhập liệu.
- 2
Chọn mã hóa hoặc giải mã
Chọn Encode để chuyển văn bản sang định dạng an toàn cho URL, hoặc Decode để chuyển văn bản đã mã hóa phần trăm trở lại bình thường.
- 3
Chạy chuyển đổi
Xử lý dữ liệu đầu vào để biến đổi nó ngay lập tức theo chiều đã chọn.
- 4
Sao chép kết quả
Sao chép kết quả đã mã hóa hoặc giải mã để dùng trong liên kết, chuỗi truy vấn, hoặc các yêu cầu API.
Giải thích về mã hóa URL và mã hóa phần trăm
Mã hóa URL là gì
Mã hóa URL, gọi chính xác hơn là mã hóa phần trăm, là cơ chế cho phép một URL mang theo những ký tự mà bản thân nó vốn không thể biểu diễn được. Một URL chỉ được dùng một tập nhỏ các ký tự ASCII, và một số ký tự trong đó còn mang ý nghĩa cấu trúc đặc biệt. Mã hóa phần trăm thay thế bất kỳ ký tự gây rắc rối nào bằng một dấu phần trăm theo sau là hai chữ số thập lục phân của giá trị byte của nó, nên khoảng trắng trở thành %20 và dấu thăng trở thành %23.
Các quy tắc này được định nghĩa trong RFC 3986, chuẩn quy định cú pháp URI. Mục tiêu rất đơn giản: bảo đảm một giá trị đặt bên trong một URL được truyền đi và phân tích đúng hệt như ý định, mà không có ký tự lạc lõng nào bị nhầm thành dấu phân tách hay bị phần mềm trên đường đi loại bỏ.
Ký tự dành riêng và ký tự không dành riêng
RFC 3986 chia các ký tự thành nhiều nhóm. Tập không dành riêng luôn an toàn và không bao giờ bị mã hóa: các chữ cái A-Z và a-z, các chữ số 0-9, cùng bốn dấu gạch nối (-), dấu chấm (.), gạch dưới (_) và dấu ngã (~). Chúng đi qua nguyên vẹn vì không mang ý nghĩa cấu trúc nào và hợp lệ ở mọi nơi trong một URL.
Tập dành riêng là những dấu câu phân tách các phần của một URL: các dấu phân tách chung : / ? # [ ] @ và các dấu phân tách phụ ! $ và & ' ( ) * + , ; =. Những ký tự này hợp lệ khi đóng vai trò dấu phân tách, nhưng khi chúng xuất hiện bên trong một giá trị thay vì làm dấu phân tách thì phải được mã hóa phần trăm để bộ phân tích không đọc sai. Chẳng hạn, một dấu và bên trong một giá trị truy vấn buộc phải trở thành %26, nếu không nó sẽ bị đọc thành điểm khởi đầu của một tham số mới.
Nền tảng byte UTF-8
Mã hóa phần trăm hoạt động trên byte chứ không trực tiếp trên ký tự, và các URL hiện đại dùng UTF-8 làm nguồn byte. Một ký tự ASCII là một byte duy nhất, nên một ký tự ASCII đã mã hóa chỉ là một dấu thoát phần trăm. Một ký tự nằm ngoài ASCII trước hết được biểu diễn thành chuỗi byte UTF-8 của nó, rồi mỗi byte được mã hóa phần trăm riêng, tạo ra một dấu thoát cho mỗi byte.
Chữ cái có dấu é là minh họa tiêu chuẩn. Trong UTF-8 nó là hai byte 0xC3 và 0xA9, nên nó mã hóa phần trăm thành %C3%A9 — hai dấu thoát cho một ký tự nhìn thấy được. Ký hiệu euro, ba byte trong UTF-8, trở thành %E2%82%AC. Đây là lý do văn bản phi Latinh phình ra rất nhiều khi được mã hóa: mỗi ký tự có thể biến thành hai, ba hoặc bốn dấu thoát phần trăm tùy theo độ dài UTF-8 của nó.
Ví dụ thực hành: mã hóa một giá trị tìm kiếm
Giả sử bạn muốn đưa cụm từ "Q&A: cats + dogs" vào một chuỗi truy vấn. Các chữ cái, chữ số và phần văn bản quanh dấu hai chấm vẫn giữ nguyên dạng từ, nhưng những ký tự không an toàn và dành riêng thì bị thoát. Khoảng trắng trở thành %20, dấu và trở thành %26, dấu hai chấm trở thành %3A, và dấu cộng trở thành %2B vì một dấu cộng nguyên văn nếu không sẽ bị đọc thành khoảng trắng trong dữ liệu form.
Kết quả là Q%26A%3A%20cats%20%2B%20dogs. Đặt vào một liên kết dưới dạng ?q=Q%26A%3A%20cats%20%2B%20dogs, máy chủ giải mã nó trở lại đúng cụm từ gốc. Hãy lưu ý rằng mọi ký tự dành riêng vốn được dùng làm dữ liệu, chứ không phải làm dấu phân tách, đều phải được mã hóa để sống sót qua chặng đường.
Khoảng trắng: %20 và dấu cộng
Khoảng trắng có một điểm kỳ quặc nổi tiếng. Trong đường dẫn và phần lớn một URL, khoảng trắng được mã hóa thành %20. Nhưng trong định dạng application/x-www-form-urlencoded dùng cho việc gửi form HTML và nhiều chuỗi truy vấn, khoảng trắng theo truyền thống được mã hóa thành dấu cộng (+). Cả hai quy ước đều đang được dùng tích cực, và đây là một nguồn gây nhầm lẫn thường gặp.
Hệ quả thực tế là một dấu cộng nguyên văn trong dữ liệu kiểu form phải tự được mã hóa thành %2B, để nó không bị nhầm thành khoảng trắng. Khi bạn giải mã, bạn phải biết quy ước nào đã tạo ra chuỗi đó: một dấu cộng trong giá trị form nghĩa là khoảng trắng, còn một dấu cộng ở nơi khác thường nghĩa là một dấu cộng nguyên văn. Công cụ này xử lý mã hóa phần trăm tiêu chuẩn để các giá trị của bạn đi và về một cách sạch sẽ.
Mã hóa cả một URL và mã hóa một giá trị đơn lẻ
JavaScript cung cấp hai hàm tương ứng với hai công việc khác nhau, và chọn nhầm hàm là một lỗi kinh điển. encodeURI dành cho cả một URL: nó giữ nguyên các ký tự cấu trúc : / ? # & = để URL vẫn hoạt động, chỉ mã hóa những ký tự rõ ràng bất hợp lệ như khoảng trắng. encodeURIComponent dành cho một mẩu dữ liệu đơn lẻ, chẳng hạn một giá trị truy vấn hay một đoạn đường dẫn: nó thoát cả các dấu phân tách dành riêng, nên một dấu gạch chéo hay dấu và nhúng bên trong không thể làm hỏng URL bao quanh.
Công cụ này thực hiện mã hóa kiểu thành phần — hành vi của encodeURIComponent — vốn là mặc định an toàn để chèn một giá trị không đáng tin cậy vào giữa các dấu phân tách mà bạn kiểm soát: nó thoát cả các dấu phân tách dành riêng, nên một dấu gạch chéo hay dấu và nhúng bên trong không thể làm hỏng URL bao quanh. Đánh đổi là bạn không nên dán cả một địa chỉ hoàn chỉnh vào đây, vì nó cũng sẽ thoát các ký tự cấu trúc : / ? # & = và làm hỏng liên kết. Để mã hóa cả một URL, hãy mã hóa từng giá trị hoặc từng đoạn đường dẫn riêng lẻ rồi tự mình ghép địa chỉ hoàn chỉnh lại.
Sai lầm mã hóa hai lần
Mã hóa hai lần là lỗi mã hóa phần trăm thường gặp nhất. Nó xảy ra khi văn bản đã được mã hóa lại bị mã hóa thêm một lần nữa. Tác nhân kích hoạt chính là dấu phần trăm: dấu phần trăm là một ký tự dành riêng, nên mã hóa nó sẽ biến %20 thành %2520, bởi dấu % đứng đầu trở thành %25 còn 20 thì giữ nguyên. Một giá trị đã bị mã hóa hai lần sẽ hiển thị các chuỗi thoát nguyên văn như %2520 cho người dùng cuối thay vì khoảng trắng như mong muốn.
Hãy tránh nó bằng cách mã hóa đúng một lần, ngay tại thời điểm bạn dựng URL, và bằng cách không bao giờ cho một chuỗi vốn đã chứa các dấu thoát phần trăm chạy qua bộ mã hóa lần nữa. Nếu bạn thấy %25 theo sau là thứ trông như một dấu thoát khác, thì gần như chắc chắn bạn đang nhìn vào dữ liệu bị mã hóa hai lần, và cách khắc phục là giải mã nó thêm một lần hoặc loại bỏ bước mã hóa thừa trong mã của bạn.
Nơi bạn sẽ dùng đến nó
Mã hóa phần trăm có mặt ở mọi nơi mà một giá trị di chuyển bên trong một URL. Việc dựng chuỗi truy vấn cho tìm kiếm và bộ lọc, tạo các liên kết chứa văn bản do người dùng nhập, truyền tham số đến các REST API, nhúng đích chuyển hướng vào trong một tham số return_url, và ký các yêu cầu phải khớp byte với byte đều phụ thuộc vào việc mã hóa đúng. Các máy chủ web và framework tự động giải mã các URL đến, nên dạng đã mã hóa thường là thứ bạn tạo ra hơn là đọc.
Một thói quen hữu ích là mã hóa riêng từng mẩu động khi bạn ghép một URL, thay vì mã hóa chuỗi hoàn chỉnh trong một lượt. Điều đó giữ nguyên các dấu phân tách của bạn trong khi làm cho mọi giá trị đều an toàn, và nó né được cả việc mã hóa thiếu vốn làm hỏng liên kết lẫn việc mã hóa hai lần vốn làm sai lệch chúng.
Câu hỏi thường gặp
URL encoding thực sự làm gì?
Công cụ này có thể vừa mã hóa vừa giải mã không?
Công cụ có xử lý ký tự đặc biệt và các ngôn ngữ khác không?
Khác biệt giữa mã hóa một URL đầy đủ và một giá trị đơn lẻ là gì?
Dữ liệu của tôi có riêng tư không và công cụ có miễn phí không?
Công cụ liên quan
Tiếp tục với những công cụ hữu ích này