Bạn không nên sử dụng encodeURIComponent()
hoặc encodeURI()
. Bạn nên sử dụng fixedEncodeURIComponent()
và fixedEncodeURI()
theo Tài liệu MDN.
Về encodeURI()
...
Nếu một người muốn làm theo RFC3986 mới hơn cho URL, tạo dấu ngoặc vuông dành riêng (cho IPv6) và do đó không được mã hóa khi tạo thứ gì đó có thể là một phần của URL (chẳng hạn như máy chủ), đoạn mã sau có thể giúp:
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']');
}
Về encodeURIComponent()
...
Để tuân thủ nghiêm ngặt hơn RFC 3986 (dự trữ!, ', (,) Và *), ngay cả khi các ký tự này không có công dụng phân định URI chính thức, bạn có thể sử dụng những điều sau một cách an toàn:
function fixedEncodeURIComponent(str) {
return encodeURIComponent(str).replace(/[!'()*]/g, function(c) {
return '%' + c.charCodeAt(0).toString(16);
});
}
Vì vậy, sự khác biệt là gì? fixedEncodeURI()
và fixedEncodeURIComponent()
chuyển đổi cùng một tập hợp các giá trị, nhưng fixedEncodeURIComponent()
cũng chuyển đổi nhóm này: +@?=:*#;,$&
. Tập hợp này được sử dụng trong GET
các tham số ( &
, +
v.v.), thẻ liên kết ( #
), thẻ ký tự đại diện ( *
), phần email / tên người dùng ( @
), v.v.
Ví dụ: - Nếu bạn sử dụng encodeURI()
, user@example.com/?email=me@home
sẽ không gửi đúng cách thứ hai @
đến máy chủ, ngoại trừ trình duyệt của bạn xử lý khả năng tương thích (như Chrome thường làm thường xuyên).