Kapan menyandikan ruang ke plus (+) atau% 20?

Jawaban:

481

+berarti spasi hanya dalam application/x-www-form-urlencodedkonten, seperti bagian permintaan URL:

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

Dalam URL ini, nama parameter query namedengan spasi dan nilainya query valuedengan spasi, tetapi nama folder di jalur secara harfiah foo+bar, bukan foo bar .

%20adalah cara yang valid untuk menyandikan spasi di salah satu dari konteks ini. Jadi, jika Anda perlu menyandikan URL string untuk disertakan di bagian URL, selalu aman untuk mengganti spasi dengan %20dan ditambah dengan %2B. Inilah yang misalnya. encodeURIComponent()lakukan dalam JavaScript. Sayangnya bukan itu yang dilakukan urlencode di PHP ( rawurlencode lebih aman).

Lihat Juga Aplikasi spesifikasi HTML 4.01 / x-www-form-urlencoded

bobince
sumber
5
Sungguh saya bingung, Pertanyaan saya adalah, kapan browser melakukan form pertama, dan kapan melakukan yang kedua?
Muhammad Hewedy
11
Browser akan membuat query+name=query+valueparameter dari formulir dengan <input name="query name" value="query value">. Itu tidak akan dibuat query%20namedari formulir, tapi itu benar-benar aman untuk menggunakannya, misalnya. jika Anda menempatkan pengiriman formulir bersama diri Anda untuk XMLHttpRequest. Jika Anda memiliki URL dengan spasi di dalamnya, seperti <a href="http://www.example.com/foo bar/">, maka browser akan menyandikannya %20untuk Anda memperbaiki kesalahan Anda, tetapi itu mungkin sebaiknya tidak diandalkan.
bobince
6
apa fungsi make javascript foo barke foo+bar?
Sisir
21
@Sisir: tidak ada fungsi JS yang akan melakukan pengkodean URL-form. Anda dapat melakukannya secara alami encodeURIComponent(s).replace(/%20/g, '+')jika Anda benar-benar membutuhkannya+
bobince
2
Itu adalah contoh yang sangat, sangat membingungkan dari sesuatu yang bentuk-urlencoded. Itu tidak ada hubungannya dengan URL.
Dave Van den Eynde
54

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

Bagian sebelum tanda tanya harus menggunakan% encoding (jadi %20untuk spasi), setelah tanda tanya Anda bisa menggunakan salah satu %20atau +untuk spasi. Jika Anda membutuhkan yang aktual +setelah penggunaan tanda tanya %2B.

cerberos
sumber
6
@DaveVandenEynde Mengapa tidak?
cerberos
10
karena itu salah. Ini bagian dari jenis media aplikasi / x-www-form-urlencoded lama yang tidak berlaku untuk URL. Juga, decodeURIComponentjangan memecahkan kode itu.
Dave Van den Eynde
3
Ya itu mungkin disalin dari RFC 1630 dan tidak pernah benar-benar standar. tools.ietf.org/html/rfc3986 adalah standar (diperbarui lagi untuk IPv6 atau sesuatu). Tentu browser masih "mendukung" itu tetapi apa artinya itu? Baik kode server atau klien yang membaca string kueri dan menerjemahkannya, bukan browser. Browser hanya melewatinya bolak-balik, dan karena itu +adalah karakter yang dilindungi undang - undang itu akan dipertahankan oleh browser.
Dave Van den Eynde
18
Google menggunakan + untuk spasi di url pencariannya ( google.com/#q=perl+equivalent+to+php+urlencode+spaces+as+%2B ).
Justin
2
FYI: Rails juga menerjemahkan ruang dengan +secara default ( { foo: 'bar bar'}.to_query=> foo=bar+bar)
wrtsprt
46

Jadi, jawaban di sini agak tidak lengkap. Penggunaan '% 20' untuk menyandikan spasi di URL secara eksplisit didefinisikan dalam RFC3986 , yang mendefinisikan bagaimana URI dibangun. Tidak disebutkan dalam spesifikasi ini menggunakan '+' untuk ruang penyandian - jika Anda hanya mengikuti spesifikasi ini, spasi harus disandikan sebagai '% 20'.

Penyebutan menggunakan '+' untuk ruang pengkodean berasal dari berbagai inkarnasi spesifikasi HTML - khususnya di bagian yang menggambarkan tipe konten 'application / x-www-form-urlencoded'. Ini digunakan untuk memposting data formulir.

Sekarang, Spesifikasi HTML 2.0 (RFC1866) secara eksplisit mengatakan, di bagian 8.2.2, bahwa bagian Permintaan dari string URL permintaan GET harus dikodekan sebagai 'application / x-www-form-urlencoded'. Ini, secara teori, menunjukkan bahwa menggunakan '+' di URL dalam string kueri adalah sah (setelah '?').

Tapi ... benarkah itu? Ingat, HTML sendiri merupakan spesifikasi konten, dan URL dengan string kueri dapat digunakan dengan konten selain HTML. Lebih lanjut, sementara versi selanjutnya dari spesifikasi HTML terus mendefinisikan '+' sebagai legal dalam konten 'application / x-www-form-urlencoded', mereka sepenuhnya menghilangkan bagian yang mengatakan bahwa string permintaan permintaan GET didefinisikan sebagai tipe itu. Sebenarnya, tidak disebutkan apa pun tentang pengkodean string kueri apa pun setelah spesifikasi HTML 2.0.

Yang meninggalkan kita dengan pertanyaan - apakah itu valid? Tentu saja ada BANYAK kode lawas yang mendukung '+' dalam string kueri, dan banyak kode yang menghasilkannya juga. Jadi peluangnya bagus Anda tidak akan putus jika Anda menggunakan '+'. (Dan, pada kenyataannya, saya melakukan semua penelitian tentang hal ini baru-baru ini karena saya menemukan situs utama yang gagal menerima '% 20' dalam kueri GET sebagai spasi. Mereka benar-benar gagal memecahkan kode APA PUN persen karakter yang disandikan. Jadi layanan yang Anda lakukan Sedang menggunakan mungkin juga relevan.)

Tetapi dari pembacaan spesifikasi yang murni, tanpa bahasa dari spesifikasi HTML 2.0 dibawa ke versi yang lebih baru, URL sepenuhnya ditanggung oleh RFC3986, yang berarti spasi harus dikonversi ke '% 20'. Dan tentunya itu yang seharusnya terjadi jika Anda meminta sesuatu selain dokumen HTML.

zgwortz
sumber
Untuk menambahkan jawaban Anda, Chrome secara default mengkodekan spasi dalam URL sebagai %20( <a href="?q=a b">), tetapi ketika Anda mengirim formulir, ia menggunakan +tanda. Anda bisa menimpanya dengan menggunakan +tanda ( <a href="?q=a+b">), atau dengan mengirimkan formulir menggunakan XMLHTTPRequest.
x-yuri
Sangat sulit untuk memahami tujuan menambahkan URLSearchParams developers.google.com/web/updates/2016/01/urlsearchparams , yang berfungsi dalam beberapa cara lama (serialkan SPACE ke '+'). Itu bahkan tidak didukung di IE11!
Nymphetamine
9

Lebih baik untuk selalu menyandikan spasi sebagai% 20, bukan sebagai "+".

Itu adalah RFC-1866 (spesifikasi HTML 2.0), yang menetapkan bahwa karakter spasi harus dikodekan sebagai "+" dalam "application / x-www-form-urlencoded" pasangan-nilai kunci tipe-tipe konten. (lihat paragraf 8.2.1. sub-paragraf 1.). Cara pengkodean data formulir ini juga diberikan dalam spesifikasi HTML nanti, cari paragraf yang relevan tentang aplikasi / x-www-form-urlencoded.

Berikut adalah contoh dari string dalam URL di mana RFC-1866 memungkinkan ruang pengkodean sebagai plus: "http://example.com/over/there?name=foo+bar". Jadi, hanya setelah "?", Spasi dapat diganti dengan plus, menurut RFC-1866. Dalam kasus lain, spasi harus dikodekan ke% 20. Tetapi karena sulit untuk menentukan konteksnya, itu praktik terbaik untuk tidak pernah menyandikan spasi sebagai "+".

Saya akan merekomendasikan untuk meng-encode semua karakter kecuali "unreserved" yang didefinisikan dalam RFC-3986, hal.2.3

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
Maxim Masiutin
sumber
1
Dalam .Net Framework UrlEncode menggunakan '+' di QueryString, tetapi dalam modern .Net Core% 20 digunakan
Michael Freidgeim
@ MiFreidgeimSO-stopbeingevil Terima kasih telah memberi tahu kami. Tampaknya .Net Core modern memutuskan untuk lebih konsisten dan kompatibel.
Maxim Masiutin
2

Apa bedanya: Lihat jawaban lain.

Kapan digunakan, +bukan %20? Gunakan +jika, karena alasan tertentu, Anda ingin membuat string kueri URL ( ?.....) atau fragmen hash ( #....) lebih mudah dibaca. Contoh: Anda sebenarnya dapat membaca ini:

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

Tetapi yang berikut ini jauh lebih sulit dibaca: (setidaknya bagi saya)

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

Saya pikir +tidak akan merusak apa pun, karena Google menggunakan +(lihat tautan 1 di atas) dan mereka mungkin sudah memikirkan hal ini. Saya akan menggunakan +diri saya hanya karena dapat dibaca + Google berpikir tidak apa-apa.

KajMagnus
sumber
7
Saya mengatakan argumen "keterbacaan" adalah pertahanan terbaik untuk '+'. Argumen "google melakukannya" itu salah en.wikipedia.org/wiki/Argument_from_authority
FlipMcF
2
@FlipMcF Halaman salah argumen-dari-otoritas Wikipedia adalah tentang "ketika otoritas dikutip pada topik di luar bidang keahlian mereka atau ketika otoritas dikutip bukan ahli sejati " - Namun, saya pikir komputer, HTTP, dan URL pengodean adalah hal-hal dalam bidang keahlian Google.
KajMagnus
3
@FlipMcF Mengutip perilaku google, dalam hal ini, adalah argumen yang valid untuk menggunakan "+" di URL. Bukan berarti Google adalah otoritas, tetapi Google mungkin adalah perusahaan internet terbesar dan jika mereka melakukan sesuatu dengan cara tertentu, sangat tidak mungkin suatu hari browser akan memutuskan untuk berhenti mendukung praktik itu. Juga, google chrome adalah salah satu browser dengan pangsa tertinggi, dan mereka akan mendukung apa pun yang diinginkan Google. Semua dalam semua, saya akan mengatakan bahwa tidak ada yang menggunakan "+" bukannya "% 20" akan mengalami kesulitan karena itu di masa mendatang.
jdferreira
Saya ingin melanjutkan argumen ini di tempat lain, di mana ada permintaan popularitas untuk menolak mengakui permintaan terhadap otoritas. Setidaknya kita semua bisa sepakat pada satu hal: '+' lebih unggul daripada '% 20'
FlipMcF
1
Sebenarnya URL dengan% 20 jauh lebih mudah dibaca karena browser (desktop) menunjukkan URL yang didekodekan di bagian bawah jendela jika Anda memindahkan kursor mouse ke atas tautan. Tanda plus ditampilkan tidak berubah.
Martin