Boşluk ne zaman artı (+) veya% 20 olarak kodlanır?


Yanıtlar:


481

+Bir boşluk anlamına yalnızca içinde application/x-www-form-urlencodedböyle bir URL sorgu parçası olarak içerik:

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

Bu URL'ye, parametre adıdır query nameboşlukla ve değer query valueboşlukla, ancak yolun klasör adı anlamıyla foo+bar, değil foo bar .

%20bu bağlamlardan herhangi birinde bir boşluğu kodlamanın geçerli bir yoludur. Dolayısıyla, bir URL'nin bir kısmına eklenmek üzere bir dizeyi URL olarak kodlamanız gerekiyorsa, boşlukları %20ve artılarını değiştirmek her zaman güvenlidir %2B. Örneğin budur. encodeURIComponent()JavaScript'te yapar. Ne yazık ki PHP'de urlencode ne yapar ( rawurlencode daha güvenlidir).

Ayrıca Bkz. HTML 4.01 Belirtim uygulaması / x-www-form-urlencoded


5
gerçekten kafam karıştı, Benim sorum, tarayıcı ilk formu ne zaman ve ikinci fomr ne zaman?
Muhammed Hewedy

11
Tarayıcı, query+name=query+valueile bir formdan bir parametre oluşturur <input name="query name" value="query value">. Bu oluşturmayacaktır query%20namebir formdan, ancak, bunun yerine örneğin o kullanmak tamamen güvenlidir. form gönderimi için bir araya getiriyorsanız XMLHttpRequest. İçinde boşluk olan bir URL'niz varsa <a href="http://www.example.com/foo bar/">, tarayıcı, %20hatayı düzeltmeniz için bunu kodlar , ancak muhtemelen en iyisi buna güvenilmez.
bobince

6
JavaScript hissetmez hangi işlevi foo bariçin foo+bar?
Sisir

21
@Sisir: URL-form kodlaması yapacak bir JS işlevi yoktur. encodeURIComponent(s).replace(/%20/g, '+')Gerçekten ihtiyacınız varsa doğal olarak yapabilirsiniz+
Bobince

2
Bu, form urlen kodlanmış bir şeyin çok ama çok kafa karıştırıcı bir örneğidir. URL'lerle hiçbir ilgisi yoktur.
Dave Van den Eynde

54

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

Soru işaretinden önceki kısım% kodlamasını ( %20boşluk için) kullanmalıdır, soru işaretinden sonra boşluk için ya %20da +boşluk için kullanabilirsiniz . +Soru işaretinden sonra bir gerçek gerekiyorsa kullanın %2B.


6
@DaveVandenEynde Neden olmasın?
cerberos

10
çünkü bu yanlış. URL'ler için geçerli olmayan eski uygulama / x-www-form-urlencoded medya türünün bir parçasıdır. Ayrıca, decodeURIComponentkodunu çözmez.
Dave Van den Eynde

3
Evet, muhtemelen RFC 1630'dan kopyalandı ve hiçbir zaman gerçekten bir standart değildi. tools.ietf.org/html/rfc3986 standarttır (IPv6 vb. için tekrar güncellenir). Tabii ki tarayıcılar hala "destekliyor" ama bu ne anlama geliyor? Sorgu dizesini okuyan ve kodu çözen sunucu veya istemci kodu, tarayıcı değil. Tarayıcı sadece ileri geri geçirir, ve o zamandan beri +bir olduğunu ayrılmış bir karakterdir tarayıcı tarafından korunacaktır.
Dave Van den Eynde

18
Google, arama URL'lerindeki boşluklar için + 'yı kullanır ( google.com/#q=perl+equivalent+to+php+urlencode+spaces+as+%2B ).
Justin

2
FYI: Raylar ayrıca boşlukları +varsayılan olarak deşifre eder ( { foo: 'bar bar'}.to_query=> foo=bar+bar)
wrtsprt

46

Yani, buradaki cevaplar biraz eksik. URL'lerde bir boşluğu kodlamak için '% 20' kullanılması , bir URI'nin nasıl oluşturulduğunu tanımlayan RFC3986'da açıkça tanımlanmıştır . Bu kodlama alanlarını kodlamak için bir '+' kullanma belirtiminden söz edilmez - yalnızca bu spesifikasyona göre giderseniz, bir boşluk '% 20' olarak kodlanmalıdır.

Boşlukları kodlamak için '+' kullanımından bahsedilmesi, HTML spesifikasyonunun çeşitli enkarnasyonlarından gelir - özellikle 'application / x-www-form-urlencoded' içerik türünü açıklayan bölümde. Bu, form verilerini göndermek için kullanılır.

Şimdi, HTML 2.0 Spesifikasyonu (RFC1866) , bölüm 8.2.2'de , bir GET isteğinin URL dizesinin Sorgu bölümünün 'application / x-www-form-urlencoded' olarak kodlanması gerektiğini açıkça belirtti. Bu, teorik olarak, sorgu dizesindeki ('?' İşaretinden sonra) URL'de '+' kullanmanın yasal olduğunu gösterir.

Ama ... gerçekten mi? HTML'nin kendisinin bir içerik spesifikasyonu olduğunu ve sorgu dizelerine sahip URL'lerin HTML dışındaki içerikle kullanılabileceğini unutmayın. Ayrıca, HTML spesifikasyonunun sonraki sürümleri 'application / x-www-form-urlencoded' içeriğinde '+' kodunu yasal olarak tanımlamaya devam ederken, GET istek sorgusu dizelerinin bu tür olarak tanımlandığını söyleyen bölümü tamamen atlarlar. Aslında, HTML 2.0 spesifikasyonundan sonra herhangi bir şeyde sorgu dizesi kodlaması hakkında herhangi bir söz yoktur.

Hangisi bizi şu soruya bırakır - geçerli mi? Kesinlikle sorgu dizelerinde '+' destekleyen bir çok eski kod ve onu da üreten bir sürü kod vardır. '+' Kullanırsanız oranlar iyi olmaz. (Ve aslında, son zamanlarda bu konuda tüm araştırmaları yaptım çünkü bir GET sorgusunda '% 20' yi boşluk olarak kabul etmeyen büyük bir site keşfettim. Aslında yüzde kodlanmış karakterin kodunu çözemediler. kullanmanız da alakalı olabilir.)

Ancak, spesifikasyonların saf bir şekilde okunmasıyla, HTML 2.0 spesifikasyonunun dili daha sonraki sürümlere taşınmadan, URL'ler tamamen RFC3986 tarafından kapsanır, bu da boşlukların '% 20'ye dönüştürülmesi gerektiği anlamına gelir. Ve kesinlikle bir HTML belgesi dışında bir şey talep ediyorsanız durum böyle olmalıdır.


Yanıtınıza eklemek için Chrome varsayılan olarak URL'lerdeki boşlukları %20( <a href="?q=a b">) olarak kodlar , ancak bir form gönderdiğinizde +işareti kullanır . Bunu açıkça +( <a href="?q=a+b">) işaretini kullanarak veya formu kullanarak göndererek geçersiz kılabilirsiniz XMLHTTPRequest.
x-yuri

Eski bir şekilde çalışan URLSearchParams developers.google.com/web/updates/2016/01/urlsearchparams eklemenin amacını anlamak gerçekten zor (SPACE'i '+' olarak serileştirin). IE11'de bile desteklenmiyor!
Nymphetamine

9

Boşlukları her zaman "+" olarak değil,% 20 olarak kodlamak daha iyidir.

Boşluk karakterlerinin "application / x-www-form-urlencoded" içerik türü anahtar / değer çiftlerinde "+" olarak kodlanması gerektiğini belirten RFC-1866 (HTML 2.0 belirtimi) idi. (bakınız paragraf 8.2.1. alt paragraf 1). Form verilerini kodlamanın bu yolu daha sonraki HTML spesifikasyonlarında da verilmiştir, application / x-www-form-urlencoded ile ilgili paragrafları arayın.

URL'de böyle bir dizeye örnek olarak RFC-1866'nın boşlukları artı olarak kodlamaya izin verdiği bir örnek verilmiştir: "http://example.com/over/there?name=foo+bar". Bu nedenle, RFC-1866'ya göre sadece "?" İşaretinden sonra boşluklar artılarla değiştirilebilir. Diğer durumlarda, boşluklar% 20 olarak kodlanmalıdır. Ancak bağlamı belirlemek zor olduğundan, boşlukları asla "+" olarak kodlamak en iyi uygulamadır.

RFC-3986, s.2.3'te tanımlanan "rezerve edilmemiş" dışındaki tüm karakterlerin yüzde olarak kodlanmasını öneririm

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

1
Net Framework'te UrlEncode, QueryString'de '+' kullanır, ancak modern .Net Core% 20 kullanılır
Michael Freidgeim

@ MiFreidgeimSO-stopbeingevil Bize bildirdiğiniz için teşekkür ederiz. Modern .Net Core'un daha tutarlı ve uyumlu olmaya karar verdiği görülüyor.
Maxim Masiutin

2

Fark nedir: Diğer cevaplara bakın.

Kullandığınızda +yerine %20? Herhangi bir +nedenle, URL sorgu dizesini ( ?.....) veya karma parçasını ( #....) daha okunabilir hale getirmek istiyorsanız kullanın . Örnek: Aslında bunu okuyabilirsiniz:

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

Ama aşağıdakileri okumak çok daha zor: (en azından benim için)

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

+Google kullandığından +(yukarıdaki 1. bağlantıya bakın) ve muhtemelen bunu düşündüklerinden , herhangi bir şeyi kırmanın olası olmadığını düşünürdüm. +Kendimi sadece okunabilir + Google'ın uygun olduğunu düşündüğü için kullanacağım .


7
"Okunabilirlik" argümanının "+" için en iyi savunma olduğunu söylüyorum. "Google does it" argümanı yanıltıcıdır en.wikipedia.org/wiki/Argument_from_authority
FlipMcF

2
@FlipMcF Otoriteden hatalı argüman Wikipedia sayfası "bir uzmanlık alanı dışındaki bir konuda bir alıntı yapıldığında veya söz konusu otorite gerçek bir uzman olmadığında " hakkında - Bence bilgisayarlar, HTTP ve URL kodlama şeyler içinde uzmanlık Google'ın alanına.
KajMagnus

3
@FlipMcF Google'ın davranışına atıfta bulunmak, bu durumda, URL'lerde "+" kullanmak için geçerli bir argümandır. Google bir otorite değil, ancak google muhtemelen en büyük internet şirketi ve bir şekilde bir şey yaparlarsa, tarayıcıların bir gün bu uygulamayı desteklemeyi bırakmaya karar vermeleri pek olası değildir. Ayrıca, google chrome en yüksek paylaşımlı tarayıcılardan biridir ve google'ın istediği her şeyi destekler. Sonuçta, "% 20" yerine "+" kullanan hiç kimsenin öngörülemeyen bir gelecekte bunun zor olduğunu söyleyebilirim.
jdferreira

Bu tartışmaya, otoriteye yapılan bir başvuruyu kabul etmeyi reddetmek için popülerliğe bir itirazın olduğu başka bir yerde devam etmek isterim. En azından hepimiz bir şey üzerinde anlaşabiliriz: '+' '% 20'den daha üstündür
FlipMcF

1
Aslında,% 20 ile URL'nin okunması çok daha kolaydır, çünkü fare imlecini bağlantının üzerine getirirseniz (masaüstü) tarayıcılar kod çözülmüş URL'yi pencerenin altında gösterir. Artı işaretleri değişmeden görüntülenir.
Martin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.