2009-10-27 65 views
526

Khi nào một khoảng trống trong một URL được mã hóa thành + và khi nào mã đó được mã hóa thành %20?Mã hóa URL ký tự khoảng trắng: + hoặc% 20?

+1

Câu hỏi này sẽ hữu ích hơn khi có một số câu hỏi dành riêng cho ngôn ngữ, phải không? – squarecandy

+0

Bản sao có thể có của [Khi nào mã hóa không gian sang cộng (+) hoặc% 20?] (Http://stackoverflow.com/questions/2678551/when-to-encode-space-to-plus-or-20) – user

+1

@ người sử dụng câu hỏi mà bạn liên kết đến được hỏi sau này, làm cho nó là sự lừa đảo, không phải là câu hỏi này. –

Trả lời

308

Từ Wikipedia (nhấn mạnh và liên kết bổ sung):

Khi dữ liệu đã được nhập vào các hình thức HTML được gửi, tên trường biểu mẫu và các giá trị được mã hóa và gửi đến máy chủ trong một thông báo yêu cầu HTTP sử dụng phương thức GET hoặc POST hoặc lịch sử qua email. Mã hóa được sử dụng theo mặc định dựa trên phiên bản rất sớm của quy tắc mã hóa phần trăm URI chung, với number of modifications chẳng hạn như bình thường hóa dòng mới và thay thế dấu cách bằng dấu "+" thay vì "% 20". Loại dữ liệu MIME được mã hóa theo cách này là ứng dụng/x-www-form-urlencoded, và nó hiện đang được định nghĩa (vẫn còn trong một cách rất lỗi thời) trong các đặc tả HTML và XForms.

Vì vậy, tỷ lệ mã hóa thực sử dụng %20 trong khi dữ liệu mẫu trong URL là trong một hình thức biến đổi sử dụng +. Vì vậy, bạn có nhiều khả năng chỉ thấy + trong các URL trong chuỗi truy vấn sau một số ?.

+2

Vì vậy, + mã hóa về mặt kỹ thuật sẽ là mã hóa đa dạng/biểu mẫu dữ liệu, trong khi mã hóa phần trăm là ứng dụng/x-www-form-urlencoded? –

+16

@BC: no - 'multipart/form-data' sử dụng mã hóa MIME; 'application/x-www-form-urlencoded' sử dụng' + 'và URI được mã hóa đúng cách sử dụng'% 20'. – McDowell

+8

"Vì vậy, bạn có nhiều khả năng chỉ thấy + trong URL trong chuỗi truy vấn sau một?" Là một cách nói. Bạn sẽ không bao giờ thấy "+" trong phần đường dẫn của URL vì nó sẽ không làm những gì bạn mong đợi (không gian). –

20

Tôi muốn giới thiệu %20.

Bạn có mã hóa chúng không? Tuy nhiên,

Tuy nhiên, điều này không nhất quán trên các ngôn ngữ. Nếu tôi không nhầm, trong PHP urlencode() xử lý các khoảng trống là + trong khi đó, urlencode() của Python coi chúng là %20.

EDIT:

Có vẻ như tôi đã nhầm lẫn. Python urlencode() (ít nhất là trong 2.7.2) sử dụng quote_plus() thay vì quote() và do đó mã hóa dấu cách là "+". Nó cũng có vẻ rằng đề xuất của W3C là dấu "+" theo đây: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

Và trên thực tế, bạn có thể làm theo cuộc tranh luận thú vị này trên theo dõi vấn đề riêng của Python về những gì để sử dụng để mã hóa không gian: http://bugs.python.org/issue13866.

EDIT # 2:

Tôi hiểu rằng cách phổ biến nhất của mã hóa "" là là "+", nhưng chỉ cần một lưu ý, nó có thể chỉ cho tôi, nhưng tôi tìm thấy điều này một chút bối rối:

import urllib 
print(urllib.urlencode({' ' : '+ '}) 

>>> '+=%2B+' 
+0

Không phải mã hóa cứng. Cố gắng xác định từ góc độ thẩm mỹ những gì url của tôi chứa khoảng trắng sẽ trông như thế nào. –

+14

PHP cũng có 'rawurlencode()' trong đó sử dụng '% 20'. – eyelidlessness

+3

'urlencode()' của Python xử lý chúng là '+' – Yarin

182

Sự nhầm lẫn này là do URL vẫn 'bị hỏng' cho đến ngày nay.

Lấy "http://www.google.com" chẳng hạn. Đây là một URL. URL là một Trình định vị tài nguyên đồng nhất và thực sự là một con trỏ đến một trang web (trong hầu hết các trường hợp). Các URL thực sự có một cấu trúc rất được xác định rõ ràng kể từ khi đặc điểm kỹ thuật đầu tiên vào năm 1994.

Chúng ta có thể trích xuất thông tin chi tiết về "http://www.google.com" URL:

+---------------+-------------------+ 
|  Part  |  Data   | 
+---------------+-------------------+ 
| Scheme  | http    | 
| Host   | www.google.com | 
+---------------+-------------------+ 

Nếu chúng ta nhìn vào một URL phức tạp hơn như:

"https://bob:[email protected]:8080/file;p=1?q=2#third"

chúng tôi có thể trích xuất thông tin sau:

+-------------------+---------------------+ 
|  Part  |  Data   | 
+-------------------+---------------------+ 
| Scheme   | https    | 
| User    | bob     | 
| Password   | bobby    | 
| Host    | www.lunatech.com | 
| Port    | 8080    | 
| Path    | /file;p=1   | 
| Path parameter | p=1     | 
| Query   | q=2     | 
| Fragment   | third    | 
+-------------------+---------------------+ 

https://bob:[email protected]:8080/file;p=1?q=2#third 
\___/ \_/ \___/ \______________/ \__/\_______/ \_/ \___/ 
    |  | |   |   |  | \_/ | | 
Scheme User Password Host  Port Path | | Fragment 
     \_____________________________/  | Query 
         |    Path parameter 
        Authority 

Ký tự dành riêng khác nhau cho từng phần.

Đối với URL HTTP, một khoảng trống trong phần đoạn đường dẫn phải được mã hóa thành "% 20" (không, hoàn toàn không phải "+"), trong khi ký tự "+" trong phần đoạn đường dẫn có thể không bị mã hóa. Bây giờ trong phần truy vấn, dấu cách có thể được mã hóa thành "+" (đối với tính tương thích ngược: không cố gắng tìm kiếm nó trong tiêu chuẩn URI) hoặc "% 20" trong khi ký tự "+" (dưới dạng kết quả của sự mơ hồ này) phải được chuyển sang "% 2B".

này có nghĩa là "màu xanh + ánh sáng màu xanh" chuỗi đã được mã hóa khác nhau trong đường dẫn và truy vấn phần:

"http://example.com/blue+light%20blue?blue%2Blight+blue".

Từ đó bạn có thể suy ra rằng mã hóa URL được xây dựng hoàn chỉnh là không thể mà không có nhận thức cú pháp về cấu trúc URL.

Điều này boils xuống đến là:

Bạn nên có %20 trước ?+ sau.

Source

+0

>> bạn nên có% 20 trước khi? và + sau Xin lỗi vì câu hỏi ngớ ngẩn. Tôi biết một chút bằng cách nào đó rằng tham số hashtag được sử dụng sau "?" tham số dấu chấm hỏi. Mặc dù nó bằng cách nào đó khác nhau vì sử dụng "#" không tải lại trang. Nhưng tôi đã cố gắng sử dụng% 20 và + ký sau thẻ bắt đầu bằng # # "và có vẻ như không hoạt động. Cái nào cần được sử dụng sau "#"? – Philcyb

+0

@Philcyb Bạn có thể muốn đọc https://en.wikipedia.org/wiki/Percent-encoding –

5

Một không gian chỉ có thể được mã hóa ra "+" trong "application/x-www-form-urlencoded" content-type cặp khóa-giá trị truy vấn là một phần của một URL. Đây là một tháng năm, không phải là một PHẢI. Trong phần còn lại của URL, nó được mã hóa là% 20. Theo tôi, tốt hơn là luôn mã hóa các khoảng trống dưới dạng% 20, không phải là "+", ngay cả trong phần truy vấn của URL, bởi vì nó là đặc tả HTML (RFC-1866) chỉ định rằng ký tự khoảng trắng nên được mã hóa dưới dạng "+" trong cặp khóa-giá trị kiểu nội dung "application/x-www-form-urlencoded". (xem đoạn 8.2.1. đoạn 1.) Cách mã hóa dữ liệu biểu mẫu này cũng được cung cấp trong các đặc tả HTML sau, ví dụ, tìm các đoạn liên quan về ứng dụng/x-www-form-urlencoded trong Đặc tả HTML 4.01, v.v. .

Đây là một chuỗi mẫu trong URL trong đó đặc điểm kỹ thuật HTML cho phép mã hóa khoảng trắng là dấu cộng: "http://example.com/over/there?name=foo+bar". Vì vậy, chỉ sau "?", Không gian có thể được thay thế bằng dấu cộng, theo đặc điểm kỹ thuật HTML. Trong các trường hợp khác, không gian phải được mã hóa thành% 20. Nhưng vì thật khó để xác định chính xác ngữ cảnh, đó là phương pháp hay nhất để không bao giờ mã hóa khoảng trắng dưới dạng "+".

Tôi khuyên bạn nên mã hóa phần trăm tất cả ký tự ngoại trừ "không được đặt trước" được xác định trong RFC-3986, tr.2.3

unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~" 

Việc triển khai phụ thuộc vào ngôn ngữ lập trình mà bạn đã chọn.

Nếu URL của bạn chứa các ký tự quốc gia, trước tiên hãy mã hóa chúng thành UTF-8 và sau đó mã hóa phần trăm kết quả.

+1

Tại sao mọi người nên quan tâm đến đặc tả HTML nếu tài nguyên được yêu cầu không phải là HTML? Tôi đã thấy "+" trong một số API Web không phản hồi với HTML, ví dụ: bạn yêu cầu một pdf. Tôi coi nó sai rằng họ không sử dụng "% 20". –

Các vấn đề liên quan