Dalam URL ini, nama parameter query namedengan spasi dan nilainya query valuedengan spasi, tetapi nama folder di jalur secara harfiah foo+bar, bukanfoo 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).
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.
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.
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.
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.
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.
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
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:
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.
@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.
Jawaban:
+
berarti spasi hanya dalamapplication/x-www-form-urlencoded
konten, seperti bagian permintaan URL:Dalam URL ini, nama parameter
query name
dengan spasi dan nilainyaquery value
dengan spasi, tetapi nama folder di jalur secara harfiahfoo+bar
, bukanfoo bar
.%20
adalah 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%20
dan 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
sumber
query+name=query+value
parameter dari formulir dengan<input name="query name" value="query value">
. Itu tidak akan dibuatquery%20name
dari formulir, tapi itu benar-benar aman untuk menggunakannya, misalnya. jika Anda menempatkan pengiriman formulir bersama diri Anda untukXMLHttpRequest
. Jika Anda memiliki URL dengan spasi di dalamnya, seperti<a href="http://www.example.com/foo bar/">
, maka browser akan menyandikannya%20
untuk Anda memperbaiki kesalahan Anda, tetapi itu mungkin sebaiknya tidak diandalkan.foo bar
kefoo+bar
?encodeURIComponent(s).replace(/%20/g, '+')
jika Anda benar-benar membutuhkannya+
http://www.example.com/some/path/to/resource?param1=value1
Bagian sebelum tanda tanya harus menggunakan% encoding (jadi
%20
untuk spasi), setelah tanda tanya Anda bisa menggunakan salah satu%20
atau+
untuk spasi. Jika Anda membutuhkan yang aktual+
setelah penggunaan tanda tanya%2B
.sumber
decodeURIComponent
jangan memecahkan kode itu.+
adalah karakter yang dilindungi undang - undang itu akan dipertahankan oleh browser.+
secara default ({ foo: 'bar bar'}.to_query
=>foo=bar+bar
)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.
sumber
%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 menggunakanXMLHTTPRequest
.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
sumber
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.sumber