Boşluk karakterini kodlayan URL: + veya% 20?


Yanıtlar:


425

Gönderen Wikipedia (vurgu ve bağlantı eklendi):

HTML formlarına girilen veriler gönderildiğinde, form alanı adları ve değerleri kodlanır ve sunucuya GET veya POST yöntemi kullanılarak veya geçmişte e-posta yoluyla bir HTTP istek iletisinde gönderilir. Varsayılan olarak kullanılan kodlama, genel URI yüzde kodlama kurallarının çok erken bir sürümüne dayanır ; satırsonu normalizasyonu ve boşlukların yerine "% 20" yerine "+" ile bir dizi değişiklik yapılır . Bu şekilde kodlanan MIME türü application / x-www-form-urlencoded şeklindedir ve şu anda HTML ve XForms belirtimlerinde tanımlanmıştır (hala çok eski bir şekilde).

Dolayısıyla, URL'lerde form verileri kullanan değiştirilmiş bir formdayken gerçek kodlama yüzdesi %20kullanılır +. Bu nedenle, büyük olasılıkla yalnızca +bir ?.


2
Yani + kodlama teknik olarak çok parçalı / form-veri kodlaması olurken, kodlama yüzdesi application / x-www-form-urlencoded olur mu?
BC.

17
@BC: hayır - multipart/form-dataMIME kodlamasını kullanır; application/x-www-form-urlencodedkullanır +ve uygun şekilde kodlanmış URI kullanır %20.
McDowell

8
"Yani büyük olasılıkla, yalnızca bir? Bir eksiktir. URL'nin yol bölümünde hiçbir zaman "+" ifadesini görmemelisiniz, çünkü beklediğinizi yapmayacaktır (boşluk).
Adam Gent

34
Yani temelde: GET teslim hedefi http://www.bing.com/search?q=hello+worldve adında boşluk olan bir kaynakhttp://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
William Entriken

8
E-posta bağlantıları için? Öğesinden sonra + değil% 20'ye ihtiyacınız olduğunu unutmayın. Örneğin mailto:support@example.org?subject=I%20need%20help,. Bunu + ile denediyseniz, e-posta boşluk yerine + es ile açılır.
Sygmoral

289

Bu karışıklık, URL'lerin bugüne kadar hala 'kırılmış' olmasıdır.

Örneğin " http://www.google.com " adresini ele alalım . Bu bir URL. URL, Tekdüzen Kaynak Konum Belirleyicisidir ve gerçekten bir web sayfasına (çoğu durumda) bir işarettir. URL'ler aslında 1994'teki ilk spesifikasyondan bu yana çok iyi tanımlanmış bir yapıya sahiptir.

" Http://www.google.com " URL'si hakkında ayrıntılı bilgi edinebiliriz :

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

Aşağıdaki gibi daha karmaşık bir URL'ye bakarsak:

" https: // bob: bobby@www.lunatech.com: 8080 / dosya; p = 1? q = 2 # üçüncü "

aşağıdaki bilgileri elde edebiliriz:

+-------------------+---------------------+
|        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:bobby@www.lunatech.com:8080/file;p=1?q=2#third
\___/   \_/ \___/ \______________/ \__/\_______/ \_/ \___/
  |      |    |          |          |      | \_/  |    |
Scheme User Password    Host       Port  Path |   | Fragment
        \_____________________________/       | Query
                       |               Path parameter
                   Authority

Ayrılmış karakterler her bölüm için farklıdır.

HTTP URL'leri için, yol parçası bölümündeki bir boşluk "% 20" olarak kodlanmalıdır (kesinlikle "+" değil), yol parçası bölümündeki "+" karakteri ise kodlanmamış olarak bırakılmalıdır.

Şimdi sorgu bölümünde, boşluklar "+" (geriye dönük uyumluluk için: URI standardında aramaya çalışmayın) veya "% 20" veya "+" karakteri (bu belirsizliğin sonucu olarak) olarak kodlanabilir. ) "% 2B" değerine kaçmalıdır.

Bu, "mavi + açık mavi" dizesinin yol ve sorgu bölümlerinde farklı şekilde kodlanması gerektiği anlamına gelir:

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

Buradan, tamamen yapılandırılmış bir URL'yi kodlamanın, URL yapısının sözdizimsel farkındalığı olmadan imkansız olduğunu çıkarabilirsiniz.

Bu kaynar:

Sen olmalıdır %20önce ?ve +sonra.

Kaynak


>> önce% 20 olmalıdır? ve + aptalca soru için özür dilerim. Biraz biliyorum bir şekilde "?" Sonra hashtag parametresi kullanılır soru işareti parametresi. Bir şekilde farklı olsa da "#" kullanmak sayfayı yeniden yüklemiyor. Ama "#" etiketinden sonra% 20 ve + işaretini kullanmaya çalışıyorum ve işe yaramıyor gibi görünüyor. Hangisinin "#" işaretinden sonra kullanılması gerekir?
Philcyb

@Philcyb Bunu okumak isteyebilirsiniz en.wikipedia.org/wiki/Percent-encoding
Matas Vaitkevicius

Sorgu bölümünün aslında "resmi" bir standardı var mı? Temelde bu kısmın uygulamaya özel olduğunu düşündüm. Uygulamaların% 99,99'u, key1=value1&key1=value2anahtarların ve değerlerin kurallara uygun olarak kodlandığı yerlerde kullanır , encodeURIComponentancak sorgu bölümünün içeriği tamamen% 100'e kadar AFAIK'dir. Diğer o zaman sadece #resmi kodlama yok ilk gider .
gman

Yinelenen soru için yinelenen bir cevap! Ama hmm, tamam, ikisinden de vazgeçtim.
Vladimir Vukanac

3
Bu ASCII bileşen etiketlemesi destansıdır.
jsejcksn

25

Ben tavsiye ederim %20.

Onları kodlamakta zorlanıyor musunuz?

Yine de bu, diller arasında çok tutarlı değil. Yanılmıyorsam, PHP'de urlencode()boşlukları +Python'ın urlencode()onlara davranır gibi davranır %20.

DÜZENLE:

Yanılıyor gibiyim. Python'lar urlencode()(en azından 2.7.2'de) quote_plus()yerine quote()"+" yerine kullanır ve kodlar. Ayrıca, W3C önerisinin şu şekilde olduğu gibi "+" olduğu anlaşılıyor: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

Ve aslında, boşlukları kodlamak için ne kullanacağınız konusunda Python'un kendi sorun izleyicisindeki bu ilginç tartışmayı takip edebilirsiniz: http://bugs.python.org/issue13866 .

DÜZENLEME # 2:

"" Kodlamanın en yaygın yolunun "+" olduğunu anlıyorum, ama sadece bir not, sadece ben olabilirim, ama bunu biraz kafa karıştırıcı buluyorum:

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

>>> '+=%2B+'

Sabit kodlama değil. Estetik bir perspektiften boşluk içeren url'lerinizin nasıl görüneceğini belirlemeye çalışmak.
BC.

Merhaba, ben de kafam karıştı, Kullanıcı html formu gönderirken, form alanı nasıl kodlar? hangi karakterle? Sonuç tarayıcıya bağlı mı?
GMsoF

1
Ve URLEncoder.encode()Java'daki yöntem de onu dönüştürür +.
рüффп

Ve sonra soru, POST isteğinin gövdesinde kodlamanın nasıl ele alınacağı ile ilgili olarak ortaya çıkar: "Content-Type: application / x-www-form-urlencoded", burada parametreler "a = b & c = d" biçimindedir, ancak hiç URL'de değil, yalnızca "belgenin" gövdesi. Bu sorundan gerçek bir karmaşa yaptılar ve kesin cevaplar bulmak zor.
fyngyrz

Perls uri_escape () onları% 20 olarak kabul ediyor
someuser

16

Bir boşluk, yalnızca bir URL'nin "application / x-www-form-urlencoded" içerik türü anahtar / değer çiftleri sorgu bölümünde "+" olarak kodlanabilir. Bence bu bir MAYIS, bir zorunluluk değil. Diğer URL'lerde% 20 olarak kodlanır.

Kanımca, boşlukları bir URL'nin sorgu bölümünde bile her zaman "+" olarak değil,% 20 olarak kodlamak daha iyidir, çünkü boşluk karakterlerinin " + "in" application / x-www-form-urlencoded "içerik türü anahtar / değer çiftleri (bkz. paragraf 8.2.1. alt paragraf 1)

Form verilerini kodlamanın bu yolu, daha sonraki HTML spesifikasyonlarında da verilmiştir. Örneğin, HTML 4.01 Spesifikasyonu'nda application / x-www-form-urlencoded ile ilgili paragrafları arayın, vb.

URL spesifikasyonunun boşlukları artı olarak kodlamasına izin verdiği örnek bir URL dizesi: " http://example.com/over/there?name=foo+bar ". Yani, sadece "?" Dan sonra, boşluklar artılarla değiştirilebilir . Diğer durumlarda, boşluklar% 20 olarak kodlanmalıdır. Ancak bağlamı doğru bir şekilde belirlemek zor olduğundan, boşlukları asla "+" olarak kodlamamak 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 / "-" / "." / "_" / "~"

Uygulama, seçtiğiniz programlama diline bağlıdır.

URL'niz ulusal karakterler içeriyorsa, önce bunları UTF-8 olarak kodlayın ve ardından sonucu yüzde olarak kodlayın.


1
İstenen kaynak HTML değilse, neden herkes HTML spesifikasyonuna önem vermelidir? HTML ile yanıt vermeyen bazı Web API'larında "+" gördüm, örneğin bir pdf istersiniz. Ben "% 20" kullanmak yanlış olduğunu düşünüyorum.
İnanılmaz Ocak

@TheincredibleJan, sana katılıyorum. Cevabım bu.
Maxim Masiutin

1
@MaximMasiutin Cevabınız "Bu bir zorunluluk değil, bir MAYIS" diyorsa, hangi spesifikasyondan bahsediyorsunuz? Mayıs ayına sahip bir özellik bulmak için uğraşıyorum. Gelen w3.org/TR/1999/REC-html401-19991224/interact/... (sorgu bölümünde) '+' kullanılarak spec 'şart' bölümü içindedir.
JosephH

2
@JosephH - notunuz için teşekkür ederim. Bu benim MAYIS hakkındaki düşüncelerim. Gönderiyi düzenledim. Demek istediğim, qouted HTML belirtimi "+" tanımlar, ancak URL bağlamında,% 20 olarak kodlama boşluklarına izin veren diğer kurallar geçerlidir.
Maxim Masiutin
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.