Thoát dấu và trong URL


203

Tôi đang cố gắng gửi một tin nhắn GET chứa các chuỗi có ký hiệu và không thể tìm ra cách thoát ký hiệu trong URL.

Thí dụ:

http://www.example.com?candy_name=M&M
result => candy_name = M

Tôi cũng đã thử:

http://www.example.com?candy_name=M\&M
result => candy_name = M\\

Tôi đang sử dụng URL thủ công, vì vậy tôi chỉ cần các ký tự chính xác.

Tôi không thể sử dụng bất kỳ thư viện. Nó được hoàn thiện bằng cách nào?

Câu trả lời:


350

Chúng cần được mã hóa theo phần trăm:

> encodeURIComponent('&')
"%26"

Vì vậy, trong trường hợp của bạn, URL sẽ trông như sau:

http://www.mysite.com?candy_name=M%26M

2
: -% 26 không hoạt động với tôi. Còn có những giải pháp nào nữa ko.?
Sanjiv

2
Khi tôi thay thế & thành% 26, nó vẫn hiển thị cùng một lỗi--A potentially dangerous Request.Path value was detected from the client (&).
Sanjiv

4
@Sanjiv: Đó là một vấn đề với mã của bạn, không phải mã hóa phần trăm. Đặt một câu hỏi.
Máy xay sinh tố

2
@Sanjiv đảm bảo bạn thay thế "&" bằng "% 26" trước. Xem mã ::: NSString * message = @ "Xin chào Jack & Jill"; message = [chuỗi tin nhắnByReplinatingOccurrencesOfString: @ "&" withString: @ "% 26"]; message = [chuỗi tin nhắnByAppendingString: @ ""]; message = [chuỗi tin nhắnByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
Nirav

40

Điều này không chỉ áp dụng cho ký hiệu và trong URL, mà cho tất cả các ký tự dành riêng . Một số trong đó bao gồm:

 # $ & + ,  / : ; = ? @ [ ]

Ý tưởng giống như mã hóa một & tài liệu HTML, nhưng bối cảnh đã thay đổi thành trong URI, ngoài việc nằm trong tài liệu HTML. Vì vậy, mã hóa phần trăm ngăn chặn các vấn đề với phân tích cú pháp bên trong cả hai bối cảnh.

Nơi mà điều này có ích rất nhiều là khi bạn cần đặt một URL bên trong một URL khác. Ví dụ: nếu bạn muốn đăng trạng thái trên Twitter:

http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com)

Có rất nhiều ký tự dành riêng trong Tweet của tôi, cụ thể là ?'():/, vì vậy tôi đã mã hóa toàn bộ giá trị của statustham số URL. Điều này cũng hữu ích khi sử dụng mailto:các liên kết có nội dung hoặc chủ đề thư, bởi vì bạn cần mã hóa bodysubjectcác tham số để giữ ngắt dòng, ký hiệu, v.v.

Khi một ký tự từ tập hợp dành riêng ("ký tự dành riêng") có ý nghĩa đặc biệt ("mục đích dành riêng") trong một ngữ cảnh nhất định và lược đồ URI nói rằng cần phải sử dụng ký tự đó cho mục đích khác, sau đó là ký tự phải được mã hóa phần trăm. Mã hóa phần trăm một ký tự dành riêng liên quan đến việc chuyển đổi ký tự thành giá trị byte tương ứng của nó trong ASCII và sau đó biểu thị giá trị đó dưới dạng một cặp chữ số thập lục phân. Các chữ số, đứng trước dấu phần trăm ("%") được sử dụng làm ký tự thoát, sau đó được sử dụng trong URI thay cho ký tự dành riêng. (Đối với ký tự không phải ASCII, nó thường được chuyển đổi thành chuỗi byte của nó trong UTF-8, và sau đó mỗi giá trị byte được biểu thị như trên.) Ví dụ, ký tự dành riêng "/", nếu được sử dụng trong "đường dẫn" thành phần của một URI, có ý nghĩa đặc biệt là một dấu phân cách giữa các đoạn đường dẫn. Nếu, theo sơ đồ URI nhất định, "/" cần nằm trong một đoạn đường dẫn, thì phải sử dụng ba ký tự "% 2F" hoặc "% 2f" trong phân đoạn thay vì "/" thô.

http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_char character


4
Trong số các danh sách trên, ! ' ( ) *không được mã hóa URL bằng cách sử dụng encodeURIComponent.
Amil Waduwawara

có một hàm urlencode của php để giải quyết vấn đề này: cách sử dụng $ escopedfilename = urlencode ($ filename);
Jeremy Young


3

Bạn có thể sử dụng% ký tự để 'thoát' các ký tự không được phép trong URL. Xem [RFC 1738].

Bảng các giá trị ASCII trên http://www.asciitable.com/ .

Bạn có thể thấy &là 26 trong thập lục phân - vì vậy bạn cần M% 26M.


2

Điều này có thể giúp nếu ai đó muốn nó trong PHP

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);


1

Tôi muốn thêm một nhận xét nhỏ về giải pháp Blender.

Bạn có thể làm như sau:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M');

Đó là đầu ra:

http://example.com?candy_name=M%26M

Điều tuyệt vời về điều này nó không chỉ hoạt động cho & mà còn cho bất kỳ nhân vật đặc biệt nào.

Ví dụ:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M?><')

Đầu ra:

"http://example.com?candy_name=M%26M%3F%3E%3C"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.