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.