Khi nào mã hóa không gian thành dấu cộng (+) hoặc% 20?


487

Đôi khi các không gian nhận URL được mã hóa thành +dấu hiệu, một số lần khác %20. Sự khác biệt là gì và tại sao điều này nên xảy ra?


11
trùng lặp URL
Cole Johnson

Câu trả lời:


481

+nghĩa là một khoảng trắng chỉ trong application/x-www-form-urlencodednội dung, chẳng hạn như phần truy vấn của URL:

http://www.example.com/path/foo+bar/path?query+name=query+value

Trong URL này, tên tham số query namecó một khoảng trắng và giá trị là query valuevới một khoảng trắng, nhưng tên thư mục trong đường dẫn là theo nghĩa đen foo+bar, không phải foo bar .

%20là một cách hợp lệ để mã hóa một khoảng trắng trong một trong hai bối cảnh này. Vì vậy, nếu bạn cần mã hóa URL một chuỗi để đưa vào một phần của URL, việc thay thế khoảng trắng bằng %20và dấu cộng bằng luôn là an toàn %2B. Đây là những gì ví dụ. encodeURIComponent()hiện trong JavaScript. Thật không may, đó không phải là những gì urlencode làm trong PHP ( rawurlencode an toàn hơn).

Xem thêm HTML 4.01 Đặc tả ứng dụng / x-www-form-urlencoding


5
Tôi thực sự bối rối, Câu hỏi của tôi là, khi trình duyệt thực hiện mẫu đầu tiên và khi nào thì fomr thứ hai?
Muhammad Hewedy

11
Trình duyệt sẽ tạo một query+name=query+valuetham số từ một biểu mẫu với <input name="query name" value="query value">. Nó sẽ không tạo ra query%20nametừ một hình thức, nhưng nó hoàn toàn an toàn để sử dụng thay vào đó, ví dụ. nếu bạn đang gửi một biểu mẫu cùng với chính bạn cho một XMLHttpRequest. Nếu bạn có một URL có một khoảng trắng trong đó, <a href="http://www.example.com/foo bar/">thì trình duyệt sẽ mã hóa nó để %20bạn sửa lỗi, nhưng có lẽ tốt nhất là không nên dựa vào.
bobince

6
gì chức năng trên make javascript foo barđể foo+bar?
Sisir

21
@Sisir: không có chức năng JS sẽ thực hiện mã hóa biểu mẫu URL. Bạn có thể tự nhiên làm encodeURIComponent(s).replace(/%20/g, '+')nếu bạn thực sự cần+
bobince

2
Đó là một ví dụ rất, rất khó hiểu về thứ gì đó được mã hóa theo mẫu. Nó không có gì để làm với URL.
Dave Van den Eynde

54

http://www.example.com/some/path/to/resource?param1=value1

Phần trước dấu chấm hỏi phải sử dụng mã hóa% (vì vậy %20đối với dấu cách), sau dấu chấm hỏi, bạn có thể sử dụng %20hoặc +cho khoảng trắng. Nếu bạn cần một thực tế +sau khi sử dụng dấu hỏi %2B.


6
@DaveVandenEynde Tại sao không?
cerberos

10
bởi vì nó sai Đây là một phần của loại phương tiện cũ / x-www-form-urlencoding không áp dụng cho URL. Ngoài ra, decodeURIComponentkhông giải mã nó.
Dave Van den Eynde

3
Vâng, nó có thể được sao chép từ RFC 1630 và không bao giờ thực sự là một tiêu chuẩn. tools.ietf.org/html/rfc3986 là tiêu chuẩn (được cập nhật lại cho IPv6 hoặc một cái gì đó). Chắc chắn các trình duyệt vẫn "hỗ trợ" nó nhưng điều đó có nghĩa là gì? Đó là mã máy chủ hoặc máy khách đọc chuỗi truy vấn và giải mã nó, không phải trình duyệt. Trình duyệt chỉ đơn giản chuyển nó qua lại và vì đó +là một ký tự dành riêng nên nó sẽ được trình duyệt bảo tồn.
Dave Van den Eynde

18
Google sử dụng + cho các khoảng trắng trong các url tìm kiếm của nó ( google.com/#q=perl+equivalent+to+php+urlencode+spaces+as+%2B ).
Justin

2
FYI: Rails cũng giải mã khoảng trắng +theo mặc định ( { foo: 'bar bar'}.to_query=> foo=bar+bar)
wrtsprt

46

Vì vậy, các câu trả lời ở đây là một chút không đầy đủ. Việc sử dụng '% 20' để mã hóa khoảng trắng trong URL được xác định rõ ràng trong RFC3986 , định nghĩa cách xây dựng URI. Không có đề cập nào trong thông số kỹ thuật này về việc sử dụng '+' cho các không gian mã hóa - nếu bạn chỉ sử dụng thông số kỹ thuật này, một khoảng trắng phải được mã hóa thành '% 20'.

Việc đề cập đến việc sử dụng '+' cho các không gian mã hóa xuất phát từ các phiên bản khác nhau của đặc tả HTML - cụ thể là trong phần mô tả loại nội dung 'application / x-www-form-urlencoding'. Điều này được sử dụng để đăng dữ liệu mẫu.

Bây giờ, Đặc tả HTML 2.0 (RFC1866) đã nói rõ ràng, trong phần 8.2.2, rằng phần Truy vấn của chuỗi URL của yêu cầu GET phải được mã hóa dưới dạng 'application / x-www-form-urlencoding'. Về lý thuyết, điều này cho thấy rằng việc sử dụng '+' trong URL trong chuỗi truy vấn (sau '?') Là hợp pháp.

Nhưng ... có thật không? Hãy nhớ rằng, HTML tự nó là một đặc tả nội dung và các URL có chuỗi truy vấn có thể được sử dụng với nội dung không phải là HTML. Hơn nữa, trong khi các phiên bản sau của thông số HTML tiếp tục định nghĩa '+' là hợp pháp trong nội dung 'application / x-www-form-urlencoding', chúng hoàn toàn bỏ qua phần nói rằng chuỗi truy vấn yêu cầu GET được xác định là loại đó. Trên thực tế, không có bất kỳ đề cập nào về mã hóa chuỗi truy vấn trong bất cứ điều gì sau thông số HTML 2.0.

Điều này để lại cho chúng tôi câu hỏi - nó có hợp lệ không? Chắc chắn có rất nhiều mã kế thừa hỗ trợ '+' trong các chuỗi truy vấn và cũng có rất nhiều mã tạo ra mã đó. Vì vậy, tỷ lệ cược là tốt, bạn sẽ không phá vỡ nếu bạn sử dụng '+'. (Và trên thực tế, tôi đã thực hiện tất cả các nghiên cứu về vấn đề này gần đây vì tôi phát hiện ra một trang web lớn không chấp nhận '% 20' trong truy vấn GET dưới dạng khoảng trắng. Họ thực sự đã không giải mã được BẤT K character ký tự được mã hóa nào. Vì vậy, dịch vụ của bạn Việc sử dụng cũng có thể có liên quan.)

Nhưng từ việc đọc các thông số kỹ thuật thuần túy, không có ngôn ngữ từ thông số kỹ thuật HTML 2.0 được chuyển sang các phiên bản mới hơn, các URL được bao phủ hoàn toàn bởi RFC3986, có nghĩa là các không gian phải được chuyển đổi thành '% 20'. Và chắc chắn đó là trường hợp nếu bạn yêu cầu bất cứ thứ gì ngoài tài liệu HTML.


Để thêm vào câu trả lời của bạn, Chrome theo mặc định mã hóa khoảng trắng trong URL dưới dạng %20( <a href="?q=a b">), nhưng khi bạn gửi biểu mẫu, nó sẽ sử dụng +dấu hiệu. Bạn có thể ghi đè bằng cách sử dụng +dấu ( <a href="?q=a+b">) hoặc bằng cách gửi biểu mẫu bằng cách sử dụng XMLHTTPRequest.
x-yuri

Mục đích thực sự khó hiểu khi thêm URLSearchParams developers.google.com/web/updates/2016/01/urlsearchparams , hoạt động theo một cách nào đó (nối tiếp SPACE thành '+'). Nó thậm chí không được hỗ trợ trong IE11!
Nymphetamine

9

Tốt hơn hết là luôn mã hóa khoảng trắng dưới dạng% 20, không phải là "+".

Đó là RFC-1866 (đặc tả HTML 2.0), đã chỉ định rằng các ký tự khoảng trắng phải được mã hóa thành các cặp khóa-giá trị loại nội dung "+" trong "application / x-www-form-urlencoding". (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 đưa ra trong các thông số kỹ thuật HTML sau này, hãy tìm các đoạn có liên quan về ứng dụng / x-www-form-urlencoding.

Dưới đây là ví dụ về một chuỗi như vậy trong URL trong đó RFC-1866 cho phép mã hóa không gian dưới dạng 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 RFC-1866. Trong các trường hợp khác, khoảng trắng nên được mã hóa thành% 20. Nhưng vì khó xác định bối cảnh, nên cách tốt nhất là không bao giờ mã hóa khoảng trắng là "+".

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

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

1
Trong .Net Framework UrlEncode sử dụng '+' trong QueryString, nhưng trong hiện đại .Net Core% 20 được sử dụng
Michael Freidgeim

@ MiFreidgeimSO-stopbeingevil Cảm ơn bạn đã cho chúng tôi biết. Có vẻ như .Net Core hiện đại đã quyết định phù hợp và tương thích hơn.
Maxim Masiutin

2

Sự khác biệt là gì: Xem các câu trả lời khác.

Khi sử dụng +thay vì %20? Sử dụng +nếu, vì một số lý do, bạn muốn làm cho chuỗi truy vấn URL ( ?.....) hoặc đoạn băm ( #....) dễ đọc hơn. Ví dụ: Bạn thực sự có thể đọc điều này:

https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+instead+of+spaces ( %2B= +)

Nhưng những điều sau đây khó đọc hơn nhiều: (ít nhất là với tôi)

https://www.google.se/#q=google%20doesn%27t%20oops%20:%20%20this%20text%20%2B%20is%20different%20spaces

Tôi nghĩ rằng +không có khả năng phá vỡ bất cứ điều gì, vì Google sử dụng +(xem liên kết đầu tiên ở trên) và có lẽ họ đã nghĩ về điều này. Tôi sẽ sử dụng +bản thân mình chỉ vì có thể đọc được + Google cho rằng nó ổn.


7
Tôi nói đối số "dễ đọc" là cách bảo vệ tốt nhất cho '+'. Đối số "google does it" là
ngụy biện

2
@FlipMcF Trang Wikipedia đối số ngụy biện là về "khi một cơ quan được trích dẫn về một chủ đề bên ngoài lĩnh vực chuyên môn của họ hoặc khi cơ quan được trích dẫn không phải là một chuyên gia thực sự " - Tuy nhiên, tôi nghĩ rằng máy tính, HTTP và URL mã hóa là thứ nằm trong lĩnh vực chuyên môn của Google.
KajMagnus

3
@FlipMcF Trích dẫn hành vi của google, trong trường hợp này, là một đối số hợp lệ để sử dụng "+" trong URL. Không phải google là một cơ quan có thẩm quyền, nhưng google có lẽ là công ty internet lớn nhất và nếu họ làm điều gì đó theo một cách nào đó, rất có thể một ngày nào đó các trình duyệt sẽ quyết định ngừng hỗ trợ thực tiễn đó. Ngoài ra, google chrome là một trong những trình duyệt có tỷ lệ chia sẻ cao nhất và họ sẽ hỗ trợ bất cứ điều gì google muốn. Nói chung, tôi nói rằng không ai sử dụng "+" thay vì "% 20" sẽ gặp khó khăn vì điều đó trong tương lai gần.
jdferreira

Tôi rất muốn tiếp tục cuộc tranh luận này ở một nơi khác, nơi có sự kháng cáo về sự nổi tiếng để từ chối thừa nhận kháng cáo lên chính quyền. Ít nhất tất cả chúng ta đều có thể đồng ý về một điều: '+' vượt trội hơn '% 20'
FlipMcF

1
Trên thực tế, URL với% 20 dễ đọc hơn rất nhiều vì trình duyệt (máy tính để bàn) hiển thị URL được giải mã ở dưới cùng của cửa sổ nếu bạn di chuyển con trỏ chuột qua liên kết. Dấu cộng được hiển thị không thay đổi.
Martin
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.